[C 언어] 연산자 우선순위
모두들 코딩을 배울 때 연산자 우선순위에 대해 들어보거나 배운적이 있을 것이다.
오늘은 다양하고 많은 연산자들이 뒤섞였을 때 정확한 원리로 우선순위를 파악하는 방법에 대해 적어보려고 한다.
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)) 과 동일하다.
이 해석법을 기억하고 있으면 어떠한 포인터 연산이든 배열 연산이든 침착하게 해석 가능할 것이다.