안 쓰던 블로그

C언어 연산자 본문

언어/C, C++

C언어 연산자

proqk 2016. 2. 23. 18:23
반응형

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

++a와 a++의 차이점은 연산과 대입 중에 무엇을 먼저 하냐에 따라 다르다
1
2
3
4
5
6
7
8
9
= 0;
= a++;
 
→ b = 0
 
---
 
= 0;
= ++a;
cs

a++은 선 대입 후 연산이다.

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는 거짓이므로 0을 출력,
a < b는 참이므로 1을 출력한다.


4. 논리 연산자

 연산자

설명 

&&

 그리고 

 || 

 또는 

 ! 

아니다

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
3배 a<<1 + a 
5배 a<<2 + a
cs

만약 프로그래머가 아닌 일반인에게 뭔가 하는 것처럼 간지나게 보이고 싶다면 이런 뻘짓도 가능하다.
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
int main(void){
    int a = 2;
    printf("%d", a << 2 + a + a >> 5 + a << 2 - a + a);
 
    return 0;
}
 
4
cs


7. 연산 순위

 순위

연산자 

결합순서 

 () [] -> .(점)

좌 → 우  

- ! *(포인터) & ++ -- sizeof() cast 

좌 ← 우 

*(곱셈) / % 

좌 → 우 

 + -

<< >> 

< > <= >= 

!= == 

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
Comments