안 쓰던 블로그
C언어 연산자 본문
C언어 연산자
연산자는 C언어에서 아주 기초적인 문법이다. C언어를 알지 못하는 사람도 사칙 연산자정도는 흔히 알고 있을 정도로 간단하고, 그렇기 때문에 소흘히 넘어갈 수도 있지만 후에도 계속 나오는 중요한 부분이므로 잘 이해하고 넘어가야 된다.
1. 산술 연산자
연산자 |
설명 |
+ |
덧셈 |
- |
뺄셈 |
* |
곱셈 |
/ |
나눗셈 |
% | 나머지 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #include <stdio.h> int main(void){ int a, b; a = 10; b = 3; 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); //정수이므로 소수점 이하 생략 return 0; } → 덧셈 : 13 뺄셈 : 7 곱셈 : 30 나눗셈 : 3 나머지 : 1 | cs |
2. 증감 연산자
1 + 1, 1 - 1은 많이 쓰이기 때문에 특별하게 따로 연산자가 있다.
++은 증가연산자, --는 감소 연산자로 칭한다.
1 2 | ++a; , a++; → a = a + 1 --a; , a--; → a = a - 1 | cs |
1 2 3 4 5 6 7 8 9 | a = 0; b = a++; → b = 0 --- a = 0; b = ++a; | cs |
b에 0을 대입한 후 1을 더했기 때문에 현재 a값은 1, b값은 0이 된다.
++a는 선 연산 후 대입이다.
a에 1을 더한 후 b에 대입했기 때문에 b값은 1가 된다.
감소 연산도 마찬가지.
3. 비교 연산자
연산자 |
설명 |
== |
같다 |
> |
크다 |
< |
작다 |
>= |
크거나 같다 |
<= |
작거나 같다 |
!= |
같지 않다 |
비교 후에 참(1) 또는 거짓(0) 값을 같는다.
1 2 3 4 5 6 7 8 9 10 11 12 | #include <stdio.h> int main(void){ int a = 3; int b = 5; printf("%d\n%d\n", a > b, a < b); return 0; } → 0 1 | cs |
연산자 |
설명 |
&& |
그리고 |
|| |
또는 |
! |
아니다 |
a || b 는 a와 b 둘 중 하나라도 참이면 참이다.
a && b는 a와 b 둘 다 참이어야 참이다.
!a는 a가 아니어야 참이다.
거짓일 경우도 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <stdio.h> int main(void){ int a = 1; int b = 0; printf("%d\n", a&&b); printf("%d\n", a||b); printf("%d\n", !a); return 0; } → 0 1 0 | cs |
a는 참, b는 거짓이므로 둘 다 참이 아니기 때문에 a && b는 0을 출력한다.
어쨋든 a는 참이기 때문에 a || b는 1을 출력한다.
a는 참이고 참의 반대는 거짓이므로 0을 출력한다.
5. 복합 연산자
연산자 |
설명 |
a += b |
a = a + b |
a -= b |
a = a - b |
a *= b |
a = a * b |
a /= b |
a = a / b |
a %= b |
a = a % b |
a &= b | a = a & b |
a |= b | a = a | b |
a ^= b | a = a ^ b |
a <<= b | a = a << b |
a >>= b | a = a >> b |
단지 복합일 뿐이다. 의미는 같다.
6. 비트 연산자
연산자 |
설명 |
& |
대응되는 비트가 모두 1일 때 1 |
| |
대응되는 비트 중 하나라도 1이면 1 |
^ |
대응되는 비트가 서로 다르면 1 |
~ |
비트 반전 |
>> |
지정값만큼 왼쪽으로 비트 이동 |
<< |
지정값만큼 오른쪽으로 비트 이동 |
이제까지와는 다르게 비트를 대상으로 하는 연산자이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #include <stdio.h> int main(void){ int a = 53; //00110101 int b = 54; //00110110 printf("&연산%d\n", a&b); //00110100 printf("|연산%d\n", a|b); //00110111 printf("^연산%d\n", a^b); //00000011 printf("~a연산%d\n", ~a); //11001010 printf("a오른쪽1칸%d\n", a<<1); //00011010 printf("a오른쪽2칸%d\n", a<<2); //00001101 printf("b왼쪽1칸%d\n", b >> 1); //01101100 printf("b왼쪽2칸%d\n", b >> 2); //11011000 return 0; } → &연산52 | 연산55 ^연산3 ~a연산 - 54 a오른쪽1칸106 a오른쪽2칸212 b왼쪽1칸27 b왼쪽2칸13 | cs |
<<와 >>는 쉬프트 연산이라고 비트열을 왼쪽 또는 오른쪽으로 값만큼 움직인다.
여기서 한가지 사실을 알 수 있다.
53을 오른쪽으로 1칸 움직였더니 53*2의 결과가, 2칸 움직였더니 53*4의 결과가 나왔다.
또한 54를 왼쪽으로 1칸 움직였더니 54/2의 결과가, 2칸 움직였더니 54/4(소수점버림)의 결과가 나왔다.
쉬프트 연산으로 곱셈, 나눗셈이 가능하다는 것이다.
어? 생각해보니 위에 산술 연산자에서 곱셈과 나눗셈은 *와 /라고 알고있었다.
쉬프트 연산의 곱셈나눗셈과 산술 연산자의 곱셈나눗셈의 차이점은 속도다.
일반적인 연산자보다 쉬프트 연산은 작게는 수배부터 크게는 수십배까지의 속도 차이를 보여준다.
다만 코드의 가독성을 위해 보통은 일반 연산자를 사용하지만 속도를 고집해야만 하는 특별한 상황이라면 쉬프트 연산을 사용할 수도 있다.
한가지 단점은 쉬프트 연산은 2의 배수만 계산할 수 있다는 점이다.
이럴 경우 덧셈과 뺄셈을 잘 혼합하면 홀수 연산도 가능하다.
순위 |
연산자 |
결합순서 |
1 |
() [] -> .(점) |
좌 → 우 |
2 |
- ! *(포인터) & ++ -- sizeof() cast |
좌 ← 우 |
3 |
*(곱셈) / % |
좌 → 우 |
4 |
+ - |
|
5 |
<< >> |
|
6 |
< > <= >= |
|
7 |
!= == |
|
8 |
& |
|
9 |
^ |
|
10 |
| |
|
11 |
&& |
|
12 |
|| |
|
13 |
? : |
좌 ← 우 |
14 | = += -= *= /= %= &= |= ^= <<= >>= | |
15 | , | 좌 → 우 |
'언어 > C, C++' 카테고리의 다른 글
C언어 구조체 (0) | 2016.02.23 |
---|---|
C언어 3차원 배열과 성적의 총점 구하기 예제 (0) | 2016.02.23 |
C언어 2차원 배열과 성적의 총점 구하기 예제 (0) | 2016.02.23 |
C언어 1차원 배열 (0) | 2016.02.23 |
C언어 배열 초기화 (0) | 2016.02.22 |