본문 바로가기
  • 適者生存
WorkOut/정보처리기사

C언어 | 연산자 종류와 우선 순위

by lcrvvxln 2024. 3. 18.

 





6. 연산자 (Operator)

 

(1) 연산자 종류

  • 증감 연산자 (++/--)  : 피연산자 1씩 증가/감소
  • 산술 연산자 (+,-,*,/,%) : 산술식 구성
  • 시프트 연산자 (<<, >>) : 비트 이동
  • 관계 연산자 (>,<, >=, <=, ==, !=) : 두 피연산자 사이 크기 비교
  • 비트 연산자 (&, |, ^, ~) : 비트 단위 논리 연산
  • 논리 연산자 (&&, ||, ! ) : 두 피연산자 사이 논리적 관계 정의
  • 삼항 연산자 (조건식 ? : 참값 : 거짓값) : 조건이 참일 때, ? 뒤 첫 번째 값, 거짓일 때, ? 뒤 두 번째 값 반환
  • 대입 연산자 ( =, +=, -=, *=, /=, %= ) : 변수에 값 대입 시 사용, 오른쪽 값 이용 왼쪽 변수에 값 대입

 

* 연산자 우선 순위 암기법 *

증산시 관비 논삼대  (증산 시장에서 관노비들이 논 산대)

증감 / 산술 / 시프트 / 관계 / 비트 / 논리 / 삼항 / 대입

 

(2) 연산자 우선순위


1.  x++ , x--
- 단항 연산자, 증감 연산자

2. ++x, --x
- 단항 연산자, 증감 연산자
2. !
- 단항 연산자, 논리 연산자
2. ~
- 단항 연산자, 비트 연산자

일반적으로 연산자 우선 순위는 '증산시관비논산대' 지만
논리 연산자 중 단항 연산자인 ! 와 비트 연산자 중 단항 연산자인 ~ 는 증감 연산자와 산술 연산자 사이에 존재

또한 관계 연산자에서 같은지 다른지를 비교하는 == 와 != 는
대소 비교하는 >,<,>=,<= 연산자보다 우선 순위가 낮음


3. *, / , %
- 이항 연산자, 산술 연산자

4. +, -
- 이항 연산자, 산술 연산자

5. >>, <<
- 이항 연산자, 시프트 연산자

6. >, <, >=, <=
- 이항 연산자, 관계 연산자

7. ==, !=
- 이항 연산자, 관계 연산자

8. & (AND)
- 이항 연산자, 비트 연산자

9. ^ (XOR)
- 이항 연산자, 비트 연산자

10. | (OR)
- 이항 연산자, 비트 연산자

11. && (AND)
- 이항 연산자, 논리 연산자

12. || (OR)
- 이항 연산자, 논리 연산자

13. 조건식 ? A : B
- 삼항 연산자

14. =, +=, -=, *=, /=, %=
- 대입 연산자


(3) 연산자 상세

 

[1]  증감 연산자

++x : 변수 1 증가 후, x 사용
--x : 변수 1 감소 후, x 사용
x++: x 사용 후, 1 증가
x--: x 사용 후, 1 감소


#include <stdio.h>

int main(){
   int x=3, y=3;
   printf('%d',x++);
   printf('%d',x);
   printf('%d',++y);
   printf('%d',y);
   return 0;   
}


# 3444

  • main 부터 시작
  • x 3, y 3 선언
  • 3 출력 후, 1 증가 (x=4)
  • 4 출력 (x)
  • y 1 증가(y=4) 후, 4 출력
  • 4 출력(y)

 

#include <stdio.h>

int main(){
   int x=3, y=3;
   int z= x++ + ++y;
   printf('%d %d %d', x, y, z);
   return 0;
}

# 4 4 7
  • main 부터 시작
  • x 3, y 3 선언
  • x(=3) + y 1증가 값(=4) = z = 7, z 계산 후, x 1 증가 (=4)
  • 4 4 7 출력

 

#증감 연산자 단독 사용 

#include <stdio.h>

int main(){
   int x=3, y=3;
   x++;
   ++y;
   printf('%d %d', x, y);
   return 0;
}

# 4 4
  • x 3, y 3 선언
  • 증감 연산자 혼자 있으므로 x 1 증가 =4
  • 증감 연산자 혼자 있으므로 y 1 증가 =4
  • 4 4 출력

 

[2] 산술 연산자

+ : 양쪽 값 더하기
- : 왼쪽에서 오른쪽 빼기
* : 양쪽 값 곱하기
/ : 왼쪽에서 오른쪽 나누기
% : 왼쪽에서 오른쪽 나누고 남은 나머지 계산 (**정수끼리만 계산 가능**)


C언어에서 연산은
1. 정수 & 정수 = 정수 (**나누기 연산 시 소수점 버려짐**)
2. 정수 & 실수 = 실수
3. 실수 & 실수 = 실수

 

 

 

#incldue <stdio.h>

int main(){
   int x=3, y=2;
   float z=2.0;
   printf('%d %d\n', x%y, y%x);
   printf('%d %.2f', x/y, x/z);
   return 0;
}

# 1 2
# 1 1.50
  • 정수형 변수 x 3, y 2 선언
  • 실수형 변수 z 2.0 선언
  • 정수와 정수의 연산이므로 결과값도 정수, 3 나누기 2 한 나머지는 1, 2 나누기 3 한 나머지는 2
  • x/y는 정수와 정수 연산이므로 소수값 버림, 1.5=1
  • x/z는 정수와 실수 연산이므로 3/2.0 = 1.5인데 소수점 이하 2자리 출력이므로 1.50 출력

 

[3] 시프트 연산자

<< : 왼쪽 값을 오른쪽 값만큼 왼쪽으로 비트 이동
>> : 왼쪽 값을 오른쪽 값만큼 오른쪽으로 비트 이동

<< 는 왼쪽으로 비트 이동하므로 1비트마다 2배 증가
>> 는 오른쪽으로 비트 이동하므로 1비트마다 2배 감소



#include <stdio.h>

int main(){
   int x=11;
   printf('%d', x<<3);
   printf('%d', x>>1);
   return 0;
}

# 885
  • x 11 선언
  • 11은 2진수로 1011
  • 왼쪽으로 3비트 이동하면 1011000 = 2^0(=1)*0 + 2^1*0 + 2^2*0 + 2^3*1 + 2^4*1 + 2^5*0 + 2^6*1 = 0+0+0+8+16+0+64 = 88
  • 대입 안 했으므로 x 값은 1011 그대로
  • 1011 오른쪽 1비트 이동 시, 101 (맨 뒤 한 자리 사라짐) = 2^0(=1)*1 + 2^1*0 +2^2*1 = 1+0+4 = 5
  • 885 출력

 

[4] 관계 연산자

- 참은 1, 거짓은 0 반환

> : 왼쪽 값이 오른쪽보다 크면 1 (참), 작으면 0 (거짓)
< : 왼쪽 값이 오른쪽보다 작으면 1 (참), 크면 0 (거짓)
>= : 왼쪽 값이 오른쪽보다 크거나 같으면 1, 작으면 0
<= : 왼쪽 값이 오른쪽보다 작거나 같으면 1, 크면 0

== : 양쪽 값이 같으면 1, 다르면 0
!= : 양쪽 값이 다르면 1, 같으면 0


#include <stdio.h>

int main(){
   printf('%d\n', 3=3);
   printf('%d\n', 3!=3);
   return 0;
}

# 1
# 0
  • 3과 3은 같으므로 참인 1 출력
  • 3과 3은 같으므로 거짓인 0 출력
C언어는 논리형 변수는 없음

BUT, 논리식 계산 때 0 이면 거짓
0 아닌 값은 참으로 인식

출력 시에는 참이면 1, 거짓이면 0 출력

 

[5] 비트 연산자


& (AND 연산자) : 두 값 비트로 연산, 같은 자리 값으로 비교 했을 때 모두 1이면 1, 아니면 0 출력
| (OR 연산자) : 비트 연산 시 같은 자리 값 중 하나라도 1이면 1, 둘 다 0 이면 0 출력
^ (XOR 연산자) : 비트 연산 시 같은 자리 값이 서로 다르면 1, 같으면 0 출력
~ (NOT 연산자) : 단항 연산자로, 모든 비트의 값 반대로 반전


- AND, OR, XOR 연산자

1. AND
피연산자 모두 참이면 참, 아니면 거짓

2. OR
피연산자 모두 거짓이면 거짓, 아니면 참 (하나라도 참이면 참)

3. XOR
피연산자 서로 다르면 참, 같으면 거짓



#include <stdio.h>

int main(){
   printf('%d', 12&10);
   printf('%d', 12|10);
   printf('%d', 12^10);
   printf('%d', ~12);
   return 0;
}

# 8146-13
  • 12는 2진수로 1100, 10은 2진수로 1010
  • AND 연산 : 1&1 = 1, 1&0=0, 0&1=0, 0&0=0 > 1000 = 2^3*1 = 8
  • OR 연산 : 1|1 =1, 1|0=1, 0|1=1, 0|0=0 > 1110 = 2^3*1 + 2^2*1 + 2^1*1 = 14
  • XOR 연산 : 1^1=0, 1^0=1, 0^1=1, 0^0=0 > 0110 = 2^2*1 + 2^1*1 = 6
  • NOR 연산 : 부호 반대로 바꾼 값에 1을 뺀 값 = -12-1 = -13
  • 8146-13 출력
- NOT 연산

부호 반대로 바꾼 값에 1 뺀 값으로 기억

 

[6] 논리 연산자

- 참이면 1, 거짓은 0 반환

&& (AND) : 두 개 논릿값 모두 참이면 참(1) , 아니면 거짓(0)
|| (OR) : 두 개 논릿값 모두 거짓이면 거짓(0), 아니면 참(1)

! (NOT) : 단항 연산자로, 해당 값이 참이면 0, 거짓이면 1 반환


#include <stdio.h>

int main(){
   int x=5, y=3;
   printf('%d', x>5 && y>=3);
   printf('%d', x>5 || y>=3);
   return 0;
}

# 01
  • 0 && 1 = AND 연산이므로 0 출력
  • 0 || 1 = OR 연산이므로 1 출력

 

[7] 삼항 연산자


- 조건식 ? A (참) : B (거짓)


#include <stdio.h>

int main(){
   int a=26, b=91;
   int x= a<b ? a:b;
   printf('%d',x);
   return 0;
}

# 26
  • 26은 91보다 작으므로 참이기 때문에 물음표 연산자 뒤 첫 번째 값인 x=a=26

 

[7] 대입 연산자

= : 왼쪽 변수에 오른쪽 값 대입
+= : 왼쪽 변수에 오른쪽 값 더하고 대입
-= : 왼쪽 변수에 오른쪽 값 빼고 대입
*= : 왼쪽 변수에 오른쪽 값 곱하고 대입
/= : 왼쪽 변수에 오른쪽 값 나누고 대입
%= : 왼쪽 변수에 오른쪽 값 나누고 남은 나머지를 대입



#include <stdio.h>

int main(){
   int a=17;
   a+=1;
   a-=2;
   a*=3;
   a/=4;
   a%=5;
   printf('%d', a);
   return 0;
}

# 2
  • a = 17+1= 18
  • a = 18-2 =16
  • a = 16 *3 = 48
  • a= 48 / 4 = 12
  • a = 12 % 5 = 2
  • 2 출력