Namespaces
Variants

C++ Operator Precedence

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Operators
Operator precedence
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

다음 표는 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 콤마 연산자 왼쪽에서 오른쪽 →
  1. sizeof 의 피연산자는 C 스타일 형변환이 될 수 없습니다: 표현식 sizeof ( int ) * p 는 명확하게 ( sizeof ( int ) ) * p 로 해석되며, sizeof ( ( int ) * p ) 로 해석되지 않습니다.
  2. 조건부 연산자의 중간 표현식( ? : 사이)은 괄호로 묶인 것처럼 파싱됩니다: ?: 에 대한 우선순위는 무시됩니다.

표의 위쪽 행에 나열된 연산자는 아래쪽 행에 나열된 낮은 우선순위의 연산자보다 인수에 더 강하게 결합됩니다(괄호로 묶인 것처럼). 예를 들어, 표현식 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 + = b
a - = b
a * = b
a / = b
a % = b
a & = b
a | = b
a ^ = b
a <<= b
a >>= b

++ a
-- a
a ++
a --

+ a
- a
a + b
a - b
a * b
a / b
a % b
~a
a & b
a | b
a ^ b
a << b
a >> b

! a
a && b
a || b

a == b
a ! = b
a < b
a > b
a <= b
a >= b
a <=> b

a [ ... ]
* a
& a
a - > b
a. b
a - > * b
a. * b

함수 호출

a ( ... )
콤마

a, b
조건부 연산자

a ? b : c
특수 연산자

static_cast 관련된 타입 간 변환을 수행
dynamic_cast 상속 계층 구조 내에서 변환을 수행
const_cast cv -한정자를 추가하거나 제거
reinterpret_cast 관련 없는 타입 간 변환을 수행
C-style cast static_cast , const_cast , 그리고 reinterpret_cast 의 혼합으로 타입 변환을 수행
new 동적 저장 기간을 가진 객체를 생성
delete new 표현식으로 생성된 객체를 파괴하고 획득한 메모리 영역을 해제
sizeof 타입의 크기를 조회
sizeof... pack 의 크기를 조회 (C++11부터)
typeid 타입의 타입 정보를 조회
noexcept 표현식이 예외를 발생시킬 수 있는지 확인 (C++11부터)
alignof 타입의 정렬 요구 사항을 조회 (C++11부터)

C 문서 참조: C 연산자 우선순위