operator_precedence — 연산자 우선순위
operator_precedence — 연산자 우선순위 (Operator precedence)
**연산자 우선순위(operator precedence)**는 표현식에서 연산자가 평가되는 순서를 결정하는 규칙이에요. 높은 우선순위부터 순서대로 묶여요.
a + b * c가 (a + b) * c가 아니라 a + (b * c)로 평가되는 이유가 우선순위예요. 올바른 계산을 위해 우선순위를 알아야 해요.
출처: cppreference
본문
연산자 우선순위는 표현식의 평가 순서를 정해요. 우선순위가 높은 연산자가 먼저 적용돼요.
우선순위 예시 (높음 → 낮음)
- 포스트픽스 —
f(),x[],x++,x.y - 단항 —
+x,-x,!x,~x,++x,--x,*p,&x - 곱셈/나눗셈 —
* / % - 덧셈/뺄셈 —
+ - - 시프트 —
<< >> - 관계 —
< > <= >= - 동등 —
== != - 비트 AND —
& - 비트 XOR —
^ - 비트 OR —
| - 논리 AND —
&& - 논리 OR —
|| - 삼항 —
?: - 대입 —
= += -= ... - 콤마 —
,
결합성
같은 우선순위의 연산자들이 연속되면 결합성(associativity)에 따라 왼쪽/오른쪽으로 묶여요.
- 대부분 왼쪽 결합:
a - b - c→(a - b) - c - 대입·삼항은 오른쪽 결합:
a = b = c→a = (b = c)
예시
int r = a + b * c; // b*c 먼저, 그 후 더하기
int r2 = (a + b) * c; // 괄호로 명시
bool b = !x && (y > z); // ! 먼저, && 마지막
우선순위와 오버로딩
오버로드된 연산자도 같은 우선순위·결합성을 따라요. 사용자 정의 연산자의 우선순위는 내장과 동일해요.
노트 (Notes)
- 우선순위가 헷갈리면 괄호
()로 명확하게 해요. &&/||는 단락 평가,?:는 조건부 평가를 해요.- 하나의 표현식에서 같은 객체를 순서 없이 두 번 수정하면 정의되지 않은 동작이 돼요.