Namespaces
Variants

C 연산자 우선순위

cppreference.net에서
< 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 , 쉼표 왼쪽에서 오른쪽
  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++)로 파싱되지 않습니다.

참조

  • 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

함께 보기

평가 순서 - 연산자 인수의 런타임 평가 순서.

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

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++ 연산자 우선순위