[C언어/C++] 연산자 우선순위에 대하여

연산자 우선순위란?

연산자 우선순위란 수학 및 컴퓨터 프로그래밍에서 연산의 우선순위는 모호하게 해석가능한 수식에서 어느 연산을 먼저 계산할 것인가를 결정하는 규칙입니다. 예를 들어 수학의 사칙연산을 보면 2+3*2 라는 식이 있을때 *가 +보다 우선순위가 높기때문에 먼저 3*2 = 6이 되고 그다음에 2를 더해 최종 결과값이 8이됩니다. 이처럼 프로그래밍 언어에도 연산자에 대한 우선순위가 존재합니다. 이러한 우선순위를 모르고 개발을 하다보면 전혀 엉뚱한 결과가 도출되기도 하죠.

 

연산자 우선순위를 모르고 코딩을 하다보면 연산자 우선순위로 인하여 내가 원하는 동작이 하지 않고 엉뚱하게 동작하는 경우가 있습니다. 특히 포인터를 사용할때 많이 발생하는데요,

char arr[6] = { "hello" };
char *point = &arr[0];
printf("arr[1]의 값은 = %c", *point + 1);

연산자 우선순위 예제1

예를 들어 위의 코드를 실행을 시켰다고 해봅시다. 제가 의도한바는 hello의 첫번째 주소를 포인터 변수에 넣어주고 그 포인터 변수에 +1을 하여 hello의 두번째 값인 e를 출력하는것을 목적으로 하였습니다. 하지만 실행을 시켜보면 +연산자보다 *연산자가 우선순위가 더 높아 출력값이 e가 아니라 i가 나오는것을 확인할 수 있습니다. h값에 +1이 되어 i값이 된 것입니다.

 

char arr[6] = { "hello" };
char *point = &arr[0];
printf("arr[1]의 값은 = %c", *(point + 1));

연산자 우선순위 예제2

연산자 우선순위로 인해 다른 결과가 나올때 해결을 위해서는 가장 먼저 연산되어야 할 연산자에 괄호를 쳐주는 것이 가독성도 좋고 가장 간단합니다. 컴파일러가 표현식을 발견하고 평가할때 괄호 안에 있는 연산자를 우선순위가 가장 높은것으로 간주하기 때문입니다.

 

연산자 우선순위 표

우선순위 연산자 설명 결합 법칙(방향)
1순위

x++ 증가 연산자(뒤, 후위)
x-- 감소 연산자(뒤, 후위)
( ) 함수 호출
[ ] 배열 첨자
. 구조체/공용체 멤버 접근
-> 포인터로 구조체/공용체 멤버 접근
(자료형){값} 복합 리터럴
2순위

++x 증가 연산자(앞, 전위)
--x 감소 연산자(앞, 전위)
+x 단항 덧셈
-x 단항 뺼셈
! 논리 NOT
~ 비트 NOT
(자료형) 자료형 캐스팅(자료형 변환)
*x 포인터 x역참조
&x x의 주소
sizeof 자료형의 크기
3순위 * 곱셈
. 나눗셈
% 나머지
4순위 + 덧셈
- 뺄셈
5순위 << 왼쪽으로 비트를 시프트
>> 오른쪽으로 비트를 시프트
6순위 < 작음(논리)
<= 작거나 같음(논리)
> 큼(논리)
>= 크거나 같음(논리)
7순위 == 같음
!= 다름
8순위 & AND(비트)
9순위 ^ XOR(비트)
10순위 | OR(비트)
11순위 && AND(논리)
12순위 || OR(논리)
13순위 ? : 삼항 연산자
14순위 = 할당
+= 덧셈 후 할당
-= 뺼셈 후 할당
*= 곱셈 후 할당
/= 나눗셈 후 할당
%= 나머지 연산 후 할당
<<= 비트를 왼쪽으로 시프트 한 후 할당
>>= 비트를 오른쪽으로 시프트한 후 할당
&= 비트 AND 연산 후 할당
^= 비트 XOR 연산 후 할당
|= 비트 OR연산 후 할당
15순위 , 쉼표 연산자

 

댓글

Designed by JB FACTORY