C++ 연산자 우선순위
다음 표는 C++ 연산자의 우선순위와 결합성을 보여줍니다. 연산자는 우선순위가 높은 순서대로 위에서 아래로 나열됩니다. a, b 및 c는 피연산자입니다.
| 우선순위 | 연산자 | 설명 | 결합성 |
|---|---|---|---|
| 1 | a::b
|
범위 지정 | 왼쪽에서 오른쪽 → |
| 2 | a++ a--
|
접미사/후위 증가 및 감소 | |
type(a) type{a}
|
함수형 캐스트 | ||
a()
|
함수 호출 | ||
a[]
|
첨자 | ||
a.b a->b
|
멤버 접근 | ||
| 3 | ++a --a
|
전위 증가 및 감소 | 오른쪽에서 왼쪽 ← |
+a -a
|
단항 플러스와 마이너스 | ||
!a ~a
|
논리 NOT 및 비트 NOT | ||
(type)a
|
C 스타일 캐스트 | ||
*a
|
간접 참조 (역참조) | ||
&a
|
주소 연산자 | ||
^^a
|
리플렉션 연산자 (C++26부터) | ||
sizeof
|
크기 연산자[1] | ||
| co_await | await-표현식 (C++20) | ||
new – new[]
|
동적 메모리 할당 | ||
delete – delete[]
|
동적 메모리 해제 | ||
| 4 | a.*b a->*b
|
멤버 포인터 | 왼쪽에서 오른쪽 → |
| 5 | a * b a / b a % b
|
곱셈, 나눗셈 및 나머지 | |
| 6 | a + b a - b
|
덧셈과 뺄셈 | |
| 7 | a << b a >> b
|
비트 왼쪽 시프트와 오른쪽 시프트 | |
| 8 | a <=> b
|
삼방향 비교 연산자 (C++20부터) | |
| 9 | a < b a <= b a > b a >= b
|
관계 연산자 <의 경우 <= 및 > 및 >= 각각
| |
| 10 | a == b a != b
|
동등 연산자 =의 경우 != 각각
| |
| 11 | a & b
|
비트 AND | |
| 12 | a ^ b
|
비트 XOR (배타적 논리합) | |
| 13 | a | b
|
비트 OR (포함적 논리합) | |
| 14 | a && b
|
논리 AND | |
| 15 | a || b
|
논리 OR | |
| 16 | a ? b : c
|
삼항 조건[2] | 오른쪽에서 왼쪽 ← |
throw
|
throw 연산자 | ||
| co_yield | yield-표현식 (C++20) | ||
a = b
|
직접 대입 (C++ 클래스의 경우 기본 제공) | ||
a += b a -= b
|
복합 대입 합과 차에 의한 | ||
a *= b a /= b a %= b
|
복합 대입 곱, 몫 및 나머지에 의한 | ||
a <<= b a >>= b
|
복합 대입 비트 왼쪽 시프트와 오른쪽 시프트에 의한 | ||
a &= b a ^= b a |= b
|
복합 대입 비트 AND, XOR 및 OR에 의한 | ||
| 17 | a, b
|
쉼표 | 왼쪽에서 오른쪽 → |
표현식을 구문 분석할 때, 위 표의 어떤 행에 나열된 연산자는 더 낮은 우선순위를 가진 아래 행에 나열된 연산자보다 인수에 더 강하게 (괄호로 묶인 것처럼) 바인딩됩니다. 예를 들어, 표현식 std::cout << a & b과 *p++는 (std::cout << a) & b과 *(p++)로 구문 분석되며, std::cout << (a & b) 또는 (*p)++이 아닙니다.
동일한 우선순위를 가진 연산자는 결합성 방향에 따라 인수에 바인딩됩니다. 예를 들어, 표현식 a = b = c은 대입의 오른쪽에서 왼쪽 결합성 때문에 a = (b = c)로 구문 분석되며 (a = b) = c이 아니지만, a + b - c은 덧셈과 뺄셈의 왼쪽에서 오른쪽 결합성 때문에 (a + b) - c로 구문 분석되며 a + (b - c)이 아닙니다.
단항 연산자의 경우 결합성 지정은 중복되며 완전성을 위해서만 표시됩니다: 단항 전위 연산자는 항상 오른쪽에서 왼쪽으로 결합하며 (delete ++*p는 delete(++(*p))), 단항 후위 연산자는 항상 왼쪽에서 오른쪽으로 결합합니다 (a[1][2]++은 ((a[1])[2])++). 멤버 접근 연산자의 경우 결합성이 의미가 있습니다. 비록 단항 후위 연산자와 함께 그룹화되지만: a.b++는 (a.b)++으로 구문 분석되며 a.(b++)이 아닙니다.
연산자 우선순위는 연산자 오버로딩의 영향을 받지 않습니다. 예를 들어, std::cout << a ? b : c;는 산술 왼쪽 시프트의 우선순위가 조건 연산자보다 높기 때문에 (std::cout << a) ? b : c;으로 구문 분석됩니다.
참고 사항
우선순위와 결합성은 컴파일 타임 개념이며, 평가 순서 와는 독립적인 개념입니다. 평가 순서는 런타임 개념입니다.
표준 자체는 우선순위 수준을 명시하지 않습니다. 이는 문법에서 파생됩니다.
const_cast
,
static_cast
,
dynamic_cast
,
reinterpret_cast
,
typeid
,
sizeof...
,
noexcept
및
alignof
는 절대 모호하지 않기 때문에 포함되지 않습니다.
일부 연산자들은 대체 표기법 을 가지고 있습니다 (예를 들어, and 는 && , or 는 || , not 은 ! 등에 해당합니다).
C에서 삼항 조건 연산자는 대입 연산자보다 우선순위가 높습니다. 따라서 e = a < d ? a ++ : a = d 와 같은 표현식은 C++에서는 e = ( ( a < d ) ? ( a ++ ) : ( a = d ) ) 로 파싱되지만, C에서는 문법적 또는 의미적 제약으로 인해 컴파일되지 않습니다. 자세한 내용은 해당 C 문서를 참조하십시오.
참고 항목
| 일반 연산자 | ||||||
|---|---|---|---|---|---|---|
| 대입 |
증가
감소 |
산술 | 논리 | 비교 |
멤버
접근 |
기타 |
|
a
=
b
|
++
a
|
+
a
|
!
a
|
a
==
b
|
a
[
...
]
|
함수 호출
a ( ... ) |
|
콤마
a, b |
||||||
|
조건부 연산자
a ? b : c |
||||||
| 특수 연산자 | ||||||
|
static_cast
관련된 타입 간 변환을 수행
|
||||||
|
C 문서
참조:
C 연산자 우선순위
|