C 연산자 우선순위
다음 표는 C 연산자의 우선순위와 결합 방향을 나열합니다. 연산자는 우선순위가 높은 순서에서 낮은 순서로 위에서 아래로 나열됩니다.
| 우선순위 | 연산자 | 설명 | 결합 방향 |
|---|---|---|---|
| 1 | ++ --
|
접미사/후위 증가 및 감소 | 왼쪽에서 오른쪽 |
()
|
함수 호출 | ||
[]
|
배열 첨자 | ||
.
|
구조체 및 공용체 멤버 접근 | ||
->
|
포인터를 통한 구조체 및 공용체 멤버 접근 | ||
(type){list}
|
복합 리터럴(C99) | ||
| 2 | ++ --
|
접두사 증가 및 감소[1] | 오른쪽에서 왼쪽 |
+ -
|
단항 플러스와 마이너스 | ||
! ~
|
논리 NOT과 비트 NOT | ||
(type)
|
캐스트 | ||
*
|
간접 참조 (역참조) | ||
&
|
주소 연산자 | ||
sizeof
|
크기 연산자[2] | ||
_Alignof
|
정렬 요구 사항(C11) | ||
| 3 | * / %
|
곱셈, 나눗셈, 나머지 | 왼쪽에서 오른쪽 |
| 4 | + -
|
덧셈과 뺄셈 | |
| 5 | << >>
|
비트 왼쪽 시프트와 오른쪽 시프트 | |
| 6 | < <=
|
관계 연산자 < 및 ≤ 각각에 대해 | |
> >=
|
관계 연산자 > 및 ≥ 각각에 대해 | ||
| 7 | == !=
|
관계 연산자 == 및 != 각각에 대해 | |
| 8 | &
|
비트 AND | |
| 9 | ^
|
비트 XOR (배타적 OR) | |
| 10 | |
|
비트 OR (포괄적 OR) | |
| 11 | &&
|
논리 AND | |
| 12 | ||
|
논리 OR | |
| 13 | ?:
|
삼항 조건 연산자[3] | 오른쪽에서 왼쪽 |
| 14[4] | =
|
단순 할당 | |
+= -=
|
합과 차에 의한 할당 | ||
*= /= %=
|
곱, 몫, 나머지에 의한 할당 | ||
<<= >>=
|
비트 왼쪽 시프트와 오른쪽 시프트에 의한 할당 | ||
&= ^= |=
|
비트 AND, XOR, OR에 의한 할당 | ||
| 15 | ,
|
쉼표 | 왼쪽에서 오른쪽 |
- ↑ 접두사 연산자
++및--은(는) 타입 캐스트가 될 수 없습니다. 이 규칙은 문법적으로 의미상 무효인 일부 표현식을 금지합니다. 일부 컴파일러는 이 규칙을 무시하고 의미상 무효를 감지합니다. - ↑
sizeof의 피연산자는 타입 캐스트가 될 수 없습니다: 표현식sizeof (int) * p은(는) 명확하게(sizeof(int)) * p로 해석되지만,sizeof((int)*p)로는 해석되지 않습니다. - ↑ 조건 연산자의 중간 표현식 (
?와:사이)은 괄호로 묶인 것처럼 파싱됩니다: 즉,?:에 대한 우선순위는 무시됩니다. - ↑ 할당 연산자의 왼쪽 피연산자는 단항 (레벨 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++)로 파싱되지 않습니다.
참조
- C23 표준 (ISO/IEC 9899:2024):
- A.3.1 Expressions
- 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
함께 보기
평가 순서 - 연산자 인수의 런타임 평가 순서.
| 일반 연산자 | ||||||
|---|---|---|---|---|---|---|
| 할당 | 증가 감소 |
산술 | 논리 | 비교 | 멤버 접근 |
기타 |
|
|
|
|
|
|
|
|
C++ 문서에서 C++ 연산자 우선순위
|