C언어

[C 언어] 연산자 우선순위

Teodore 2023. 1. 26. 20:21
728x90

모두들 코딩을 배울 때 연산자 우선순위에 대해 들어보거나 배운적이 있을 것이다. 

오늘은 다양하고 많은 연산자들이 뒤섞였을 때 정확한 원리로 우선순위를 파악하는 방법에 대해 적어보려고 한다. 

 

1. 연산자 우선순위란?

연산자들이 연속으로 이어졌을 때 어떠한 연산자부터 계산해야 하는지를 나타내는 것이다. 

수학에서의 연산자 우선순위는 

() >> * /  >> + -

위와 같이 괄호가 높고 곱하기 나누기 그리고 + - 연산자 순서로 이루어지는 것이 기본이다. 

그렇다면 코드에서는 어떨까?

 

2. C 코드의 연산자들

먼저 C 코드에서 나타날 수 있는 연산자들이 어떤 것들이 있는지 살펴보자. 

연산계열 * / % + -
Bit 연산 << >> & | && || ^
비교 < <= > >= == !=
대입연산 = += -= *= /= %= &= |= ^= <<= >>=
이외의 것들 () [] -> . ++ -- ! ~ sizeof * &

내가 생각나는 것 위주로 편의상 분류를 해보았다. 

이것 외에 다른 연산자가 있으면 댓글 부탁드리면서 계속 설명을 이어가도록 하겠다. 

 

3. C 연산자 우선순위

저 많은 연산자들 중에서 어떤 것이 우선순위가 높은지를 바로 알아차리기 어려울 것이다. 

결론부터 말하자면 

단항 >> 이항 >> 삼항 >> 대입 연산자 순서로 우선순위가 높다.

단항 중에는 뒤에 붙는 연산자(후치), 그리고 앞에 붙는 연산자(전치) 순이다. 

 

단항 연산자

1
2
value = *pa + *pb;
value = va + ++vb;
cs

위의 코드에서 *과 ++은 변수의 바로 옆에 붙어 먼저 처리되는 단항 연산자이다. 

 

뒤에 붙는 연산자(후치 연산자)

1
2
value = arr[4];
value = func_sum();
cs

후치 연산자는 위의 코드에서 []와 ()이다. 즉 배열과 함수가 후치 연산자에 속한다. 

 

앞에 붙는 연산자(전치 연산자)

1
2
3
value = ++a;
value = --a;
value = *++*ptr;
cs

위와 같이 모두 변수의 앞에 붙는 것들이 전치 연산자이다. 

그리고 value = *++*ptr 같은 경우에는 변수에 가까운 것이 우선순위가 높다. 

즉 value = *(++(*ptr)) 과 동일하다. 

 

이 해석법을 기억하고 있으면 어떠한 포인터 연산이든 배열 연산이든 침착하게 해석 가능할 것이다. 

728x90