C++ Operator Precedence
다음 표는 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 | 주소 연산자 | ||
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 | 3-way 비교 연산자 (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 | 3항 조건 연산자 [각주 2] | 오른쪽에서 왼쪽 ← |
throw
|
throw 연산자 | ||
| co_yield | yield-expression (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 | 콤마 연산자 | 왼쪽에서 오른쪽 → |
- ↑ sizeof 의 피연산자는 C 스타일 형변환이 될 수 없습니다: 표현식 sizeof ( int ) * p 는 명확하게 ( sizeof ( int ) ) * p 로 해석되며, sizeof ( ( int ) * p ) 로 해석되지 않습니다.
-
↑
조건부 연산자의 중간 표현식(
?와:사이)은 괄호로 묶인 것처럼 파싱됩니다:?:에 대한 우선순위는 무시됩니다.
표의 위쪽 행에 나열된 연산자는 아래쪽 행에 나열된 낮은 우선순위의 연산자보다 인수에 더 강하게 결합됩니다(괄호로 묶인 것처럼). 예를 들어, 표현식 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 연산자 우선순위
|