C++ 연산자 우선순위란?
연산자 우선순위(precedence)는 하나의 표현식 안에서 항들이 어떻게 묶이는지를 결정하는 규칙입니다. 반면 결합성(associativity)은 괄호가 없을 때 동일한 우선순위를 가진 연산자들이 어느 방향부터 그룹화되어 평가되는지를 정하는 속성입니다. 이 두 가지 규칙은 표현식이 실제로 어떤 순서로 계산되는지에 직접적인 영향을 미칩니다.
모든 연산자가 같은 우선순위를 갖는 것은 아닙니다. 예를 들어 곱셈 연산자(*)는 덧셈 연산자(+)보다 높은 우선순위를 가집니다.
예제로 이해하기
x = 7 + 3 * 2;
위 코드에서 x에는 20이 아니라 13이 할당됩니다. 그 이유는 * 연산자가 + 연산자보다 우선순위가 높아 먼저 3 * 2 = 6이 계산되고, 이후 7 + 6 = 13이 되기 때문입니다.
C++ 연산자 우선순위 표
아래 표에서 상단에 위치한 연산자일수록 우선순위가 높고, 하단에 있을수록 우선순위가 낮습니다. 하나의 표현식 안에서는 우선순위가 높은 연산자부터 먼저 평가됩니다.
| 분류 | 연산자 | 결합 방향 |
|---|---|---|
| 후위(Postfix) | () [] -> . ++ -- | 왼쪽 → 오른쪽 |
| 단항(Unary) | + - ! ~ ++ -- (type) * & sizeof | 오른쪽 → 왼쪽 |
| 곱셈(Multiplicative) | * / % | 왼쪽 → 오른쪽 |
| 덧셈(Additive) | + - | 왼쪽 → 오른쪽 |
| 시프트(Shift) | << >> | 왼쪽 → 오른쪽 |
| 관계(Relational) | < <= > >= | 왼쪽 → 오른쪽 |
| 동등(Equality) | == != | 왼쪽 → 오른쪽 |
| 비트 AND(Bitwise AND) | & | 왼쪽 → 오른쪽 |
| 비트 XOR(Bitwise XOR) | ^ | 왼쪽 → 오른쪽 |
| 비트 OR(Bitwise OR) | | | 왼쪽 → 오른쪽 |
| 논리 AND(Logical AND) | && | 왼쪽 → 오른쪽 |
| 논리 OR(Logical OR) | || | 왼쪽 → 오른쪽 |
| 조건(Conditional) | ?: | 오른쪽 → 왼쪽 |
| 대입(Assignment) | = += -= *= /= %= >>= <<= &= ^= |= | 오른쪽 → 왼쪽 |
| 쉼표(Comma) | , | 왼쪽 → 오른쪽 |
활용 팁
동일한 우선순위의 연산자가 여러 개 함께 나타나면 위 표의 결합 방향(왼쪽 → 오른쪽 또는 오른쪽 → 왼쪽)에 따라 평가 순서가 결정됩니다. 특히 대입 연산자와 조건 연산자(?:)는 오른쪽에서 왼쪽으로 결합된다는 점을 기억해 두면 유용합니다. 복잡한 표현식에서는 의도하지 않은 계산 순서로 인한 버그를 피하기 위해 괄호 ()를 명시적으로 사용해 우선순위를 분명히 드러내는 것이 좋은 코딩 습관입니다.