operator_precedence — 연산자 우선순위

operator_precedence — 연산자 우선순위 (Operator precedence)

**연산자 우선순위(operator precedence)**는 표현식에서 연산자가 평가되는 순서를 결정하는 규칙이에요. 높은 우선순위부터 순서대로 묶여요.

a + b * c(a + b) * c가 아니라 a + (b * c)로 평가되는 이유가 우선순위예요. 올바른 계산을 위해 우선순위를 알아야 해요.

출처: cppreference

본문

연산자 우선순위는 표현식의 평가 순서를 정해요. 우선순위가 높은 연산자가 먼저 적용돼요.

우선순위 예시 (높음 → 낮음)

  1. 포스트픽스 — f(), x[], x++, x.y
  2. 단항 — +x, -x, !x, ~x, ++x, --x, *p, &x
  3. 곱셈/나눗셈 — * / %
  4. 덧셈/뺄셈 — + -
  5. 시프트 — << >>
  6. 관계 — < > <= >=
  7. 동등 — == !=
  8. 비트 AND — &
  9. 비트 XOR — ^
  10. 비트 OR — |
  11. 논리 AND — &&
  12. 논리 OR — ||
  13. 삼항 — ?:
  14. 대입 — = += -= ...
  15. 콤마 — ,

결합성

같은 우선순위의 연산자들이 연속되면 결합성(associativity)에 따라 왼쪽/오른쪽으로 묶여요.

  • 대부분 왼쪽 결합: a - b - c(a - b) - c
  • 대입·삼항은 오른쪽 결합: a = b = ca = (b = c)

예시

int r = a + b * c;      // b*c 먼저, 그 후 더하기
int r2 = (a + b) * c;   // 괄호로 명시
bool b = !x && (y > z); // ! 먼저, && 마지막

우선순위와 오버로딩

오버로드된 연산자도 같은 우선순위·결합성을 따라요. 사용자 정의 연산자의 우선순위는 내장과 동일해요.

노트 (Notes)

  • 우선순위가 헷갈리면 괄호 ()로 명확하게 해요.
  • &&/||는 단락 평가, ?:는 조건부 평가를 해요.
  • 하나의 표현식에서 같은 객체를 순서 없이 두 번 수정하면 정의되지 않은 동작이 돼요.

더 알아보기 (Learn more)

cppreference