자료실/C언어

C언어 - 연산자

자료수집중 2020. 6. 12.
반응형

c언어의 연산자를 차례대로 알아보겠습니다.

 

 

대입 연산자

int a = 10;

오른쪽 값을 왼쪽에 대입하는 연산자입니다.

 

 

산술 연산자

+(더하기), -(빼기), *(곱셈), /(나눗셈), %(나머지)

쉽게 예제로 보면

printf("%d \n", 10 + 3);
printf("%d \n", 10 - 3);
printf("%d \n", 10 * 3);
printf("%d \n", 10 / 3);
printf("%d \n", 10 % 3);

차례대로

결과가 나옵니다.

여기서 +(더하기), -(빼기), *(곱셈), /(나눗셈)은 사칙연산으로 값이 나오지만

%는 나누고 나머지 값만 출력이 됩니다.

 

 

증감 연산자

증감 연산자 ++과--는 값에 어디에 붙느냐에 따라 값이 조금 다르게 나옵니다.

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

++을 변수 앞에 입력했더니 출력 전에 1이 더해서 값이 출력되는 모습을 볼 수 있습니다.

뒤에 붙게 된다면

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

출력 후에 1이 더해지는 모습을 보여줍니다.

--도 같은 방식으로 1을 뺍니다.

 

 

비트 연산자

비트 연산자는 &(AND), |(OR), ^(XOR), ~(NOT), <<(왼쪽으로 시프트), >>(오른쪽으로 시프트)이 있습니다.

int a = 10;
int b = 13;
printf("%d \n", a&b);
printf("%d \n", a|b);
printf("%d \n", a^b);
printf("%d \n", ~a);
printf("%d \n", a<<1);
printf("%d \n", a>>2);

결과부터 보겠습니다.

비트 연산자는 일반적인 사칙연산과는 조금 다른 개념입니다.

말 그대로 비트를 연산해야 하기 때문에 2진수의 개념으로 이해해야 합니다.

a=10 이 대입되어있습니다.

이걸 비트로 변경하면

a= 00000000 00000000 00000000 00001010이 됩니다.  (int의 자료형 크기는 4byte입니다.)

b= 00000000 00000000 00000000 00001101이 됩니다.

먼저 &(AND)는 1&1=1, 1&0=0, 0&1=0, 0&0=0 입니다.

이제 a와 b의 각각 자리를 비교해서 결과를 내면

a&b=00000000 00000000 00000000 00001000이 됩니다. 10진수로 변경하면 8이 됩니다.

 

 

|(OR)는 1|1=1, 1|0=1, 0|1=1, 0|0=0 입니다.

이걸 이용해서 a|b를 풀면 a|b=00000000 00000000 00000000 00001111이 됩니다.

10진수로 변경하면 15가 됩니다.

 

 

^(XOR)는 1^1=0, 1^0=1, 0^1=1, 0^0=0 입니다.

a^b=00000000 00000000 00000000 00000111이 됩니다. 10진수로 변경하면 7이 됩니다.

 

 

~(NOT)은 0을 1로 변경하면 됩니다. 근데 왜 음수가 나왔나 하면

a= 00000000 00000000 00000000 00001010 첫 번째 맨 앞 비트는 부호 비트입니다. 0에서 1로 변하기 때문에 음수가 됩니다.

~a는 11111111 11111111 11111111 11110101이 됩니다. 2진수는 음수를 표현하는 방법이 좀 다릅니다.

 

a 값을 0으로 만들어 버리는 수를 더해준 값을 음수로 변경하면 됩니다.

 

 

<<(왼쪽으로 시프트), >>(오른쪽으로 시프트)은 입력한 값만큼 비트를 이동시키는 연산자입니다.

a<<1은 a를 왼쪽으로 한 칸 이동시키라는 의미로

a<<1=00000000 00000000 00000000 00010100이 됩니다. 오른쪽 끝에 0이 1개 붙고 왼쪽 끝자리 1개를 버리면 됩니다. 10진수로 표시하면 20이 됩니다.

반대로 a>>1은

a>>2=00000000 00000000 00000000 00000010이 됩니다. 왼쪽 끝에 0이 2개 붙고 오른쪽 끝자리 2개를 버리면 됩니다. 10진수로 표시하면 2가 됩니다.

 

 

주의할 점은

int c = 0b10111111111111111111111111110101;
printf("%d \n", c);
printf("%d \n", c << 1);

*0b를 앞에 붙이면 2진수 표기법이 됩니다.

어떤 결과가 나오는지 보면

음수가 양수가 되는 일이 벌어지게 됩니다.

한 칸이 왼쪽으로 넘어가면서 부호 비트가 1에서 0으로 변해버리는 거죠.

 

 

복합 대입 연산자

앞에서 사용한 대입, 산술, 비트 연산자를 간단하게 사용할 수 있습니다. 

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

변수 a에 10을 더해주고 싶다면 위에 예제처럼 사용해도 되지만

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

위 예제처럼 a+=10; 은 a=a+10;과 같은 의미입니다. 조금이라도 간결하게 쓸 수 있게 되는 거죠.

a += 10;
a -= 10;
a *= 10;
a /= 10;
a %= 10;
a &= 10;
a ^= 10;
a <<= 1;
a >>= 1;

산술과 비트 연산자를 간결하게 사용할 수 있습니다.

 

 

관계 연산자

관계 연산자는 ==(같다), !=(다르다), >(크다), <(작다), >=(크거나 같다), <=(작거나 같다)가 있습니다.

int a = 10;
int b = 13;

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

말로 풀어서 보면

a==b는 a가 b와 같은가

a!=b는 a와 b는 다른가

a>b는 a는 b보다 큰가

a<b는 a는 b보다 작은가

a>=b는 a는 b보다 크거나 같은가

a<=b는 a는 b보다 작거나 같은가  라는 의미입니다.

근데 컴퓨터는 참과 거짓으로 답을 할 수 없기 때문에 참(TRUE)이면 1을 거짓(FALSE)이면 0을 출력합니다.

결과를 보면

a와b의 관계를 출력해주고 있습니다.

 

 

논리 연산자

논리 연산자는 &&, ||, !가 있습니다.

나중에 나올 조건문에 많이 쓰이는 연산자로 관계 연산자와 연결해서 많이 사용합니다.

예를 보면 

int a = 10;
int b = 11;
printf("%d \n", (a > 5) && (b > 5));
printf("%d \n", (a < 5) || (b > 5));
printf("%d \n", !(a < 5) );

결과부터 보면

말로 풀어서 보면 

&&는  a&&b 라면 a가 참이고 b가 참이면 참을 출력 둘 중 하나라 또는 둘 다 거짓이라면 거짓을 출력합니다.

printf("%d \n", (a > 5) && (b > 5));를 보면 a>5보다 크기 때문에 참 b>5보다 크기때문에 참 둘 다 참이므로 1을 출력합니다.

||는 a||b라면 a또는 b중 하나 이상 참이면 참을 출력 둘 다 거짓이라면 거짓을 출력합니다.

printf("%d \n", (a < 5) || (b > 5));를 보면 a>5보다 크기 때문에 참 b>5보다 크기때문에 참 둘 다 참이므로 1을 출력합니다.

!a는 a가 거짓이라면 참을 출력 참이라면 거짓을 출력합니다.

printf("%d \n", !(a < 5) );는 a<5보다 작으므로 거짓입니다. 그래서 참이 출력됩니다.

 

 

조건 연산자

조건 연산자는 ? 가 있습니다.

예제를 보면

int a = 10;
int b = 11;
printf("%d \n", (a > b)? a:b);

결과를 보면

b의 값이 출력됩니다.

(a > b)? a:b를 풀어서 보면 a가 b보다 크다가 참이면 a를 출력 거짓이면 b를 출력입니다.라는 의미입니다.

int a = 10;
int b = 11;
int c = 23;
printf("%d \n", (a > b)? a:c);

이런 식으로도 사용은 가능합니다.

a가 b보다 크다가 참이면 a를 출력 거짓이면 c를 출력입니다.처럼 조건을 다르게 할 수도 있습니다.

 

 

콤마 연산자

콤마 연산자는 ,로 연산자를 여러 개 받을 수 있습니다.

int a = 10;
a = (2, 5, 7);
printf("%d \n", a);

 

 

2,5,7을 a에 대입하면 마지막 7만 대입되게 됩니다.

보통은 여러 개의 대입을 사용할 때 많이 사용합니다.

int a = 10,b=13,c=15;
printf("%d %d %d\n", a,b,c);

 

'자료실 > C언어' 카테고리의 다른 글

C언어 - 반복문 for(), while()  (0) 2020.06.16
C언어 - 조건문 if(), swith()  (0) 2020.06.15
C언어 - scanf()  (0) 2020.06.11
C언어 - printf()  (0) 2020.06.10
C언어 - 기본 구조의 이해  (0) 2020.06.09

댓글