Namespaces
Variants

C Operator Precedence

From cppreference.net

다음 표는 C 연산자의 우선순위와 결합 방향을 나열합니다. 연산자는 위에서 아래로, 우선순위가 높은 순서대로 나열됩니다.

우선순위 연산자 설명 결합 방향
1 ++ -- 접미사 증가 및 감소 왼쪽에서 오른쪽
() 함수 호출
[] 배열 첨자
. 구조체 및 공용체 멤버 접근
-> 포인터를 통한 구조체 및 공용체 멤버 접근
( type ){ list } 복합 리터럴 (C99)
2 ++ -- 접두사 증가 및 감소 [note 1] 오른쪽에서 왼쪽
+ - 단항 덧셈 및 뺄셈
! ~ 논리 NOT 및 비트 NOT
( type ) 형변환
* 간접 참조(역참조)
& 주소 연산
sizeof 크기 연산 [note 2]
_Alignof 정렬 요구사항 (C11)
3 * / % 곱셈, 나눗셈 및 나머지 왼쪽에서 오른쪽
4 + - 덧셈 및 뺄셈
5 << >> 비트 왼쪽 시프트 및 오른쪽 시프트
6 < <= 관계 연산자 < 및 ≤ 각각
> >= 관계 연산자 > 및 ≥ 각각
7 == != 관계 연산자 = 및 ≠ 각각
8 & 비트 AND
9 ^ 비트 XOR(배타적 OR)
10 | 비트 OR(포함적 OR)
11 && 논리 AND
12 || 논리 OR
13 ?: 삼항 조건 연산자 [note 3] 오른쪽에서 왼쪽
14 [note 4] = 단순 할당
+= -= 합과 차에 의한 할당
*= /= %= 곱, 몫, 나머지에 의한 할당
<<= >>= 비트 왼쪽 시프트 및 오른쪽 시프트에 의한 할당
&= ^= |= 비트 AND, XOR, OR에 의한 할당
15 , 쉼표 왼쪽에서 오른쪽
  1. 접두사 ++ -- 의 피연산자는 형변환이 될 수 없습니다. 이 규칙은 문법적으로 일부 의미상 유효하지 않은 표현들을 금지합니다. 일부 컴파일러는 이 규칙을 무시하고 의미론적으로 유효하지 않음을 감지합니다.
  2. sizeof 의 피연산자는 형변환이 될 수 없습니다: 표현식 sizeof ( int ) * p 는 명확하게 ( sizeof ( int ) ) * p 로 해석되며, sizeof ( ( int ) * p ) 로 해석되지 않습니다.
  3. 조건부 연산자 중간의 표현식( ? : 사이)은 괄호로 묶인 것처럼 파싱됩니다: ?: 에 대한 상대적 우선순위는 무시됩니다.
  4. 할당 연산자의 왼쪽 피연산자는 단항(레벨-2 비캐스트) 표현식이어야 합니다. 이 규칙은 문법적으로 일부 의미상 유효하지 않은 표현들을 금지합니다. 많은 컴파일러가 이 규칙을 무시하고 의미론적으로 유효하지 않음을 감지합니다. 예를 들어, e = a < d ? a ++ : a = d 는 이 규칙 때문에 파싱할 수 없는 표현식입니다. 그러나 많은 컴파일러가 이 규칙을 무시하고 이를 e = ( ( ( a < d ) ? ( a ++ ) : a ) = d ) 로 파싱한 후, 의미론적으로 유효하지 않기 때문에 오류를 발생시킵니다.

표현식을 파싱할 때, 어떤 행에 나열된 연산자는 그 아래 행에 나열된 어떤 연산자보다도 인수에 더 강하게(괄호로 묶인 것처럼) 결합됩니다. 예를 들어, 표현식 * p ++ * ( p ++ ) 로 파싱되며, ( * p ) ++ 로 파싱되지 않습니다.

동일한 셀에 있는 연산자들(한 셀에 여러 행의 연산자들이 나열될 수 있음)은 주어진 방향으로 동일한 우선순위를 가지고 평가됩니다. 예를 들어, 표현식 a = b = c a = ( b = c ) 로 파싱되며, ( a = b ) = c 처럼 파싱되지 않습니다. 이는 오른쪽에서 왼쪽으로의 결합성 때문입니다.

참고 사항

우선순위와 결합성은 평가 순서 와 독립적입니다.

표준 자체는 우선순위 수준을 명시하지 않습니다. 이는 문법에서 파생됩니다.

C++에서 조건 연산자는 대입 연산자와 같은 우선순위를 가지며, 접두사 ++ -- 및 대입 연산자들은 피연산자에 대한 제한이 없습니다.

단항 연산자에 대한 결합성 명세는 중복되며 완전성을 위해 표시됩니다: 단항 접두사 연산자는 항상 우측에서 좌측으로 결합합니다 ( sizeof ++* p sizeof ( ++ ( * p ) ) )이고 단항 접미사 연산자는 항상 좌측에서 우측으로 결합합니다 ( a [ 1 ] [ 2 ] ++ ( ( a [ 1 ] ) [ 2 ] ) ++ ). 멤버 접근 연산자는 단항 접미사 연산자와 함께 그룹화되지만 결합성이 의미가 있음에 유의하십시오: a. b ++ ( a. b ) ++ 로 파싱되며 a. ( b ++ ) 가 아닙니다.

참고문헌

  • C17 표준 (ISO/IEC 9899:2018):
  • A.2.1 Expressions
  • C11 표준 (ISO/IEC 9899:2011):
  • A.2.1 Expressions
  • C99 표준 (ISO/IEC 9899:1999):
  • A.2.1 Expressions
  • C89/C90 표준 (ISO/IEC 9899:1990):
  • A.1.2.1 Expressions

참고 항목

연산자 인자의 실행 시점 평가 순서.

일반 연산자
대입 증가
감소
산술 논리 비교 멤버
접근
기타

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 - > b
a. b

a ( ... )
a, b
( type ) a
a ? b : c
sizeof


_Alignof
(C11부터)
(C23 이전)

alignof
(C23부터)

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