컴퓨터 공부/© C

[C언어] 2. 연산자

letzgorats 2021. 1. 27. 01:51

2.연산자

 

<연산자(Operator)와 피연산자(Operand)>

ex) A+B에서 ‘A’,’B’는 피연산자 ‘+’는 연산자

- 피연산자는 연산에 포함되는 변수상수를 의미

 

<대입연산자>

- '='등호 를 이용해서 우변항을 좌변항에 넣을 수 있다.->자료형에 부합하는 값을 좌변항에 있는 변수에 넣습니다.:할당

 

<산술연산자>

- 사칙연산(+,-,*,/)

- 나누기는 / 를 사용하는데 몫만 나온다.

- %(modular연산)는 나머지를 구할 수 있다.

 

(예제1) 사칙연산

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main(void) {

        int a, b;

        scanf("%d %d", &a, &b);

        printf("%d + %d = %d\n",a,b,a+b);

        printf("%d - %d = %d\n",a,b,a-b);

        printf("%d * %d = %d\n",a,b,a*b);

        printf("%d / %d = %d\n",a,b,a/b);

        printf("%d %% %d = %d\n",a,b,a%b);

        system("pause");

        return 0;
}

(해설) printf문에서 원하는 값이 3개니까 당연히 변수도 3개 들어가야한다.

 

 

<이스케이프 시퀀스(Escape Sequence)>

- 특정한 표현을 출력하기 위해 사용하는 문법

□ \n: 줄바꾸기

\t: 수평 탭 넣기

\\: 백슬래쉬 넣기

\": 큰따옴표 넣기

\b: 백스페이스 넣기

 

(예제2)이스케이프 시퀀스

#include <stdio.h>

int main(void) {

        printf("\"A\tB\tC\tD\"\n");

        printf("\"A\tB\tC\tD\"\n");

        printf("\"A\tB\tC\tD\"\n");

        system("pause");

        return 0;

}

(해설) 출력하면 A    B    C    D 가 나온다. 갑자기 생각나서 넣는건데 코딩 짤 때 복사 붙여넣기 하고 싶으면 그냥 드래그 안하고 마우스커서가 있는 줄에서 ctrl+c누르면 다음줄에 ctrl+v누르면 된다.

그리고 system(pause); return 0; 안써도 값은 나온다.

\\은 백슬래쉬, \은 큰따옴표를 출력해준다.

왜 줄바꾸기 \n을 이 문제 뿐만 아니라 다 넣어줬을까? ▶관례라고 생각해라. \n을 해야 보기 편함.

 

<관계 연산자>

 

- 컴퓨터는 0을 거짓(False), 그 외 어떠한 숫자도 다 참(True)로 받아들임.

- ,컴퓨터가 거짓(False)를 출력할 때는 0, (True)를 출력할 때는 1을 출력

「 > : 크다

  < : 작다

  ==: 같다

  !=: 다르다(! not을 뜻한다)

  >=: 크거나 같다(부등호 먼저)

  <=: 작거나 같다(부등호 먼저) 」

 

(예제3)관계 연산자

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>


int main(void) {

        int a, b;

        scanf("%d %d",&a,&b);

        printf("%d\n",a>b);

        system("pause");

        return 0;

}

(해설) 차례로 넣은 값 중에 앞에 값(a)가 뒤에 값(b)보다 크면 참이므로 1이 출력되고

(%d라고 했으니까 당연히 숫자가 나온다.), 그 반대이거나 값이 같으면 거짓이므로 0이 출력된다.

 

<논리 연산자>

 

!: 부정(not)= True<->False

&& : 그리고(and)-둘다 참이어야지 참

||: 또는(or)- 둘 중 하나라도 참값을 가지면 참(둘다 거짓일 때만 거짓)

 

(예제4)논리 연산자

 

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main(void) {

        int a, b,c;

        scanf("%d %d %d",&a,&b,&c);

        printf("%d\n",!a);

        printf("%d\n", a&&b);

        printf("%d\n", (a>b)&&(b>c));

        system("pause");

        return 0;

}

(해설) 역시나 결과값이나 입력값이나 숫자다. (%d)

 첫번째 printf문에서는 a가 참이면 그 반대인 0, a 가 거짓(0)이면 그 반대인 1이 나온다.

 두번째 printf에서는 ab 둘다 참인지 거짓 인지에 따라 참이 나오고 거짓이 나온다.(0,1)

 세번째 printf에서는 a>b도 만족해야 하고 b>c도 만족해야 한다.여기서 궁금할 수 도 있다.

 왜 a>b>c 라고 표현을 안하고 굳이 저렇게 표현 하나? 라고 말이다. a>b>c로 써버리면 컴퓨터는 앞에서부터 내용을 읽기 때문에 예를 들어 a>b가 참이면 1, 그럼 1>c 를 해석해버리기 때문에 마땅치 않다. 그래서 a>b이고 b>c를 만족하는 표현식은 위처럼 해야 하는게 옳다.

 

<증감 연산자>

- 특정한 변수의 값을 1만큼  증가/감소시키는 연산자

 

++(변수): i의 값을 1증가시킨 후, 증가된 값을 반환 ex) ++56

(변수)++: i의 값을 1증가시킨 후, 증가되기 전의 값을 반환 ex) 5++  5

 

--(변수): i의 값을 1감소시킨 후,  감소된 값을 반환  ex) --5 4

(변수)--: i의 값을 1감소시킨 후, 감소되기전의 값을 반환 ex) 5-- 5

 

앞에 붙어있는 연산자들을 먼저 이 값을 수행하겠다고 받아들이면 암기하기 쉽겠쥬?

 

(예제5)증감 연산자

#include <stdio.h>

int main(void) {

        int a=7;

        printf("%d\n",++a);

        printf("%d\n", a++);

        printf("%d\n", ++a);

        printf("%d\n", --a);

        system("pause");

        return 0;

}

(해설) a7이 할당 되었으므로,

맨 처음 printf문에서는 8이 출력(먼저 계산->계산값 출력),

두번째 printf문에서는 8에서 9가 되었지만 계산 이전값인 8이 그대로 출력,

세번째 printf문에서는 9로 변한 값이 또 1이 증가되어 10이 출력,

마지막 printf문에서는 1이 감소 된 9가 출력된다.

 (8,8,10,9)

 

<삼항 연산자>

 

- 세 개의 항을 이용해서 조건문을 수행할 수 있는 연산자

- ((a비교b) ? 맞으면 : 틀리면) (?를 기준으로 괄호안의 값이 맞으면 왼쪽, 틀리면 오른쪽 값이 출력)

 

(예제6)삼항 연산자

#include <stdio.h>

int main(void) {

        int a = 7, b = 7;

        printf("%d\n",(a==b)?100:-100);

        printf("%d\n",(a>b)?14:-14);

        printf("%s\n",(a==b)?"맞습니다":"아닙니다");

        printf("%s\n",(a++>b)?"Correct":"Wrong");

        system("pause");

        return 0;

(해설) ab에 각각 7이 할당 되었는데,

 첫번째 printf문에서는 (a==b)가 맞으므로 100이 왼쪽 값인 100이 출력되고,

 두번째 printf문에서는 (a>b)가 아니므로 오른쪽 값인 -14가 출력된다.

 세번째 printf문에서는 (a==b)가 맞으므로 왼쪽값인 맞습니다가 출력되는데, 여기서 주의해야 할 점은 문자열이 출력   되므로 앞에%d\n 대신 %s\n으로 바꿔줘야 한다는 것이다.

 마지막 printf문에서는 기존 a1이 더해진 값을 비교하므로 a8이되는데 주어진 조건은 맞으므로 왼쪽 값인  Correct가 출력된다.

 

<비트연산자>

 

-"비트" 단위의 연산을 수행할 때 사용할 수 있다.

 

~: 부정                 ex) ~(11000011) = (00111100)

(비트이진수가 뒤집힌다(=not))

 

&: 그리고               ex)(00001101)&(00000011) = (00000001)

&&와는 다르다! 왼쪽값 자리수와 오른쪽 값 자리수를 비교해서  둘다 1인 자리1

 

|: 또는                 ex)(11001100) | (00110000) = (11111100)

각각의 비트 단위를 비교해서 둘중의 한 개라도 1의 값을 가지면 1이다.

 

^:  배타적              ex)(11001111) ^ (00000011) = (11001100)

둘 중에한개만 1”일때 “1” = “두개의 값 중에 하나만 1”일 때 “1”이다.

 

<<: 왼쪽 시프트        ex)(00001111) << 3 = (01111000)

>>: 오른쪽 시프트      ex)(11110000) >> 3 = (00011110)

쉽게 말해!

더보기

(<<는 왼쪽 값을 2 n승을 곱한거와 같고 >>는 왼쪽값을 2 n 승을 나눈거와 같다)

==(<<는 비트를 그대로 왼쪽으로 옮겨주고 >>는 오른쪽으로 옮겨주면 된다.)

ex) 9<<1 :18         32>>5 : 1

 

 

(정리)

 

<연산자 우선순위>

1. ++, --(증감연산자)

2. !,~(not연산)

3. *,/,%(곱하기 나누기)

4. +,-(덧셈,뺄셈)

5. <<, >>(쉬프트 연산)

6. < , <=, >, >=

7. == , !=

8. 비트연산자, 논리연산자, 삼항 연산자

9. 삼항 연산자

반응형

'컴퓨터 공부 > © C' 카테고리의 다른 글

[C언어] 6. 배열  (0) 2021.01.28
[C언어] 5. 함수  (0) 2021.01.27
[C언어] 4. 반복문  (0) 2021.01.27
[C언어] 3. 조건문  (0) 2021.01.27
[C언어] 1. 기본 입출력  (0) 2021.01.27