C++의 연산자 우선순위는 굉장히 중요합니다. 이를 고려하지 않고 프로그래밍을 하게 된다면, 의도치 않은 방향으로 프로그램이 진행될 수 있으며, 버그를 일으키거나, 극단적으로는 프로그램이 멈추거나, 컴파일에서 에러가 발생할 수 있습니다.
하지만 C++에서의 연산자의 개수는 많아서, 외우는 것보다는 오류나, 논리적인 오류가 발생했을 때 참고하는 정도로 하시는게 좋습니다. 또한, C++을 자주 사용하시다보면 자연스럽게 외워지는게 연산자 우선순위입니다.
우선순위는 그룹별로 나뉘며, 그룹중 1그룹이 가장 먼저 적용됩니다. 그리고, 결합 규칙은 L-R(왼쪽에서 오른쪽) 연산이 대부분이고, R-L(오른쪽에서 왼쪽) 연산은 극히 일부입니다.
그룹 | 연산자 |
결합규칙 |
의미 |
1그룹 | :: |
없음 |
범위 연산자 |
2그룹 | . 또는 -> |
L-R |
멤버 선택(개체 또는 포인터) |
| [ ] |
배열 첨자 |
|
| () |
함수 호출 |
|
| ++ |
후위 증가 |
|
| -- |
후위 감소 |
|
| typeid() |
형식 이름 |
|
| const_cast |
상수 형식 변환 |
|
| dynamic_cast | 동적 형식 변환 | |
| reinterpret_cast | 재해석 형식 변환 | |
| static_cast | 정적 형식 변환 | |
3그룹 | sizeof | R-L | 개체 또는 형식의 크기 |
| ++ | 전위 증가 | |
| -- | 전위 감소 | |
| ~ | 1의 보수 | |
| ! | 논리 NOT | |
| - | 단항 부정 연산자 | |
| + | 단항 더하기 | |
| & | 참조 연산자 | |
| * | 간접 참조 | |
| new | 개체 만들기 | |
| delete | 개체 삭제 | |
| Cast: () | 캐스팅 연산자 | |
4그룹 | .* 또는 ->* | L-R | 멤버 포인터(개체 또는 포인터) |
5그룹 | * | L-R | 곱하기 |
| / | 나누기 | |
| % | 나머지(모듈러스) | |
6그룹 | + | L-R | 더하기 |
| - | 빼기 | |
7그룹 | << | L-R | 왼쪽 시프트 |
| >> | 오른쪽 시프트 | |
8그룹 | < | L-R | 비교 (보다 작음) |
| > | 비교 (보다 큼) | |
| <= | 비교 (작거나 같음 ) | |
| >= | 비교 (크거나 같음) | |
9그룹 | == | L-R | 비교 (같음) |
| != | 비교 (같지 않음) | |
10그룹 | & | L-R | 비트 AND |
11그룹 | ^ | L-R | 배타적 비트 OR |
12그룹 | | | L-R | 포괄적 비트 OR |
13그룹 | && | L-R | 논리 AND |
14그룹 | || | L-R | 논리곱 OR |
15그룹 | ? : | R-L | 조건 (3항 연산자) |
16그룹 | = | R-L | 대입 (할당) |
| *= | 곱하기 대입 | |
| /= | 나누기 대입 | |
| %= | 모듈러스 대입 | |
| += | 더하기 대입 | |
| -= | 빼기 대입 | |
| <<= | 왼쪽 시프트 대입 | |
| >>= | 오른쪽 시프트 대입 | |
| &= | 비트 AND 대입 | |
| |= | 포괄적 비트 OR 대입 | |
| ^= | 배타적 비트 OR 대입 | |
17그룹 | throw | R-L | throw 식 |
18그룹 | , | L-R | 쉼표 |
※ 본 우선순위 표는 MSDN문서를 참고했으며, Visual Studio 2015를 기준으로 작성했습니다.