Namespaces
Variants

C++ 연산자 우선순위

cppreference.net에서
 
 
C++ 언어
일반 주제
흐름 제어
조건 실행문
if
반복문 (루프)
점프문
함수
함수 선언
람다 함수 표현식
inline 지정자
동적 예외 명세 (C++17까지*)
noexcept 지정자 (C++11)
예외
네임스페이스
타입
지정자
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
저장 기간 지정자
초기화
표현식
대체 표현
리터럴
부울 - 정수 - 부동 소수점
문자 - 문자열 - nullptr (C++11)
사용자 정의 (C++11)
유틸리티
어트리뷰트 (C++11)
타입
typedef 선언
타입 별칭 선언 (C++11)
캐스트
메모리 할당
클래스
클래스별 함수 속성
explicit (C++11)
static

특수 멤버 함수
템플릿
기타
 
 

다음 표는 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 쉼표 왼쪽에서 오른쪽 →
  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 연산자 우선순위