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 |
댓글