C Operator Precedence
다음 표는 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 |
,
|
쉼표 | 왼쪽에서 오른쪽 |
-
↑
접두사
++와--의 피연산자는 형변환이 될 수 없습니다. 이 규칙은 문법적으로 일부 의미상 유효하지 않은 표현들을 금지합니다. 일부 컴파일러는 이 규칙을 무시하고 의미론적으로 유효하지 않음을 감지합니다. -
↑
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 ++ ) 가 아닙니다.
참고문헌
- 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
|
+
a
|
!
a
|
a
==
b
|
a
[
b
]
|
a
(
...
)
|
|
C++ 문서
참조:
C++ 연산자 우선순위
|