{{위키데이터 속성 추적}}
{{번역 중|en:Operators in C and C++}}
이것은 [[C (프로그래밍 언어)|C]]와 [[C++]] [[프로그래밍 언어]]의 [[연산자 (프로그래밍)|연산자]]의 목록이다. 나열된 모든 연산자는 C++에 존재한다. 네번째 열("C에 포함됨")은 해당 연산자가 C에 존재하는지를 표시한다. C는 연산자 오버로딩을 지원하지 않는다.

연산자가 오버로드되지 않았다면, <code>&&</code>, <code>||</code>, <code>,</code>([[쉼표 연산자]]) 연산자는 첫 번째 피연산자(operand)가 평가된 시점이 [[시퀀스 포인트]]이다.

C++는 [[형 변환]] 연산자인 <code>const_cast</code>, <code>static_cast</code>, <code>dynamic_cast</code>, <code>reinterpret_cast</code>를 포함한다. 이들 연산자의 서식은 우선순위 단계가 중요하지 않다는 것을 의미한다.

C와 C++에서 사용 가능한 연산자 중 대부분은  [[C 샤프|C#]], [[자바 (프로그래밍 언어)|자바]], [[펄]], 그리고 [[PHP]]와 같은 다른 언어에서도 동일한 우선순위, 결합법칙,  의미론으로 사용가능하다.

== 연산자 표 ==
이 표에서 <code>a</code>, <code>b</code>, <code>c</code>는 경우에 따라 유효한 값(리터럴, 변수 값, 반환 값), 개체 이름, 왼쪽 값(lvalue)을 나타낸다. <code>R</code>, <code>S</code>, <code>T</code>는 자료형을 나타내고 <code>K</code>는 클래스나 열거형을 나타낸다.

=== 산술 연산자 ===
{| class="wikitable"
! colspan="2" rowspan="2" | 연산자 이름
! rowspan="2" | 구문
! rowspan="2" | 오버로드 <wbr/>가능<wbr/><ref group="참고" name="overloadable">연산자가 C++에서 오버로드 가능한(''overloadable'') 것을 의미한다.</ref>
! rowspan="2" | [[C (프로그래밍 언어)|C]]에 포함됨<ref group="참고" name="c_include">C에서 연산자가 있고 의미론적 의미를 가지는 것을 의미한다.(C는 [[연산자 오버로딩]]을 지원하지 않는다.)</ref>
|-
! T의 멤버로서
! 외부 클래스 정의들
|-
| colspan="2" | 대입
| style="text-align:center;" class="nowrap" | <code>a '''=''' b</code> || {{yes}} || {{yes}}
| {{cpp|1=T& T::operator=(const T& b);}}
| {{N/A}}
|-
| colspan="2" | [[덧셈]]
| style="text-align:center;" class="nowrap" | <code>a '''+''' b</code> || {{yes}} || {{yes}}
| {{cpp|1=T T::operator+(const T& b) const;}}
| {{cpp|1=T operator+(const T& a, const T& b);}}
|-
| colspan="2" | [[뺄셈]]
| style="text-align:center;" class="nowrap" | <code>a '''-''' b</code> || {{yes}} || {{yes}}
| {{cpp|1=T T::operator-(const T& b) const;}}
| {{cpp|1=T operator-(const T& a, const T& b);}}
|- 
| colspan="2" | [[단항 연산|단항]] 덧셈<br/>([[형 변환|정수 승급]])
| style="text-align:center;" class="nowrap" | <code>'''+'''a</code> || {{yes}} || {{yes}}
| {{cpp|1=T T::operator+() const;}}
| {{cpp|1=T operator+(const T& a);}}
|-
| colspan="2" | 단항 뺄셈<br/>([[반수 (수학)|반수]])
| style="text-align:center;" class="nowrap" | <code>'''-'''a</code> || {{yes}} || {{yes}}
| {{cpp|1=T T::operator-() const;}}
| {{cpp|1=T operator-(const T& a);}}
|-
| colspan="2" | [[곱셈]]
| style="text-align:center;" class="nowrap" | <code>a '''*''' b</code> || {{yes}} || {{yes}}
| {{cpp|1=T T::operator*(const T& b) const;}}
| {{cpp|1=T operator*(const T &a, const T& b);}}
|-
| colspan="2" | [[나눗셈]]
| style="text-align:center;" class="nowrap" | <code>a '''/''' b</code> || {{yes}} || {{yes}}
| {{cpp|1=T T::operator/(const T& b) const;}}
| {{cpp|1=T operator/(const T& a, const T& b);}}
|-
| colspan="2" | [[모듈러 연산|모듈러]] (나머지)
| style="text-align:center;" class="nowrap" | <code>a '''%''' b</code> || {{yes}} || {{yes}}
| {{cpp|1=T T::operator%(const T& b) const;}}
| {{cpp|1=T operator%(const T& a, const T& b);}}
|-
| rowspan="2" | [[증감 연산자|증가]]
| 전위
| style="text-align:center;" class="nowrap" | <code>'''++'''a</code> || {{yes}} || {{yes}}
| {{cpp|1=T& T::operator++();}}
| {{cpp|1=T& operator++(T& a);}}
|-
| 후위
| style="text-align:center;" class="nowrap" | <code>a'''++'''</code>
| {{yes}}
| {{yes}}
| {{cpp|1=T T::operator++(int);}}<ref group="참고" name="int">[[C++]]는 전위 및 후위 사이의 증가 연산자를 구별하는 이름없는 더미 매개변수 <code>int</code>를 사용한다.</ref>
| {{cpp|1=T operator++(T& a, int);}}<ref group="참고" name="int"/>
|-
| rowspan="2" | [[증감 연산자|감소]]
| 전위
| style="text-align:center;" class="nowrap" | <code>'''--'''a</code> || {{yes}} || {{yes}}
| {{cpp|1=T& T::operator--();}}
| {{cpp|1=T& operator--(T& a);}}
|-
| 후위
| style="text-align:center;" class="nowrap" | <code>a'''--'''</code> || rowspan="2" {{yes}} || rowspan="2" {{yes}}
| {{cpp|1=T T::operator--(int);}}<ref group="참고" name="int"/>
| {{cpp|1=T operator--(T& a, int);}}<ref group="참고" name="int"/>
|}

=== 비교 연산자/관계 연산자 ===
{| class="wikitable"
! rowspan="2" | 연산자 {{nobr|이름}}
! rowspan="2" | 구문
! rowspan="2" | 오버로드<br/>가능<ref group="참고" name="overloadable"/>
! rowspan="2" | [[C (프로그래밍 언어)|C]]에서<br/>포함됨<ref group="참고" name="c_include"/>
! colspan="2" | 프로토타입 예제
|-
! T의 멤버로서
! 외부 클래스 정의들
|-
| 같음
| style="text-align:center;" class="nowrap" | <code>a '''==''' b</code> || {{yes}} || {{yes}}
| {{cpp|1=bool T::operator==(const T& b) const;}}
| {{cpp|1=bool operator==(const T& a, const T& b);}}
|-
| 같지 {{nobr|않음}}
| style="text-align:center;" class="nowrap" | <code>a '''!=''' b</code> || {{yes}} || {{yes}}
| {{cpp|1=bool T::operator!=(const T& b) const;}}
| {{cpp|1=bool operator!=(const T& a, const T& b);}}
|- 
| 큼
| style="text-align:center;" class="nowrap" | <code>a '''>''' b</code> || {{yes}} || {{yes}}
| {{cpp|1=bool T::operator>(const T& b) const;}}
| {{cpp|1=bool operator>(const T& a, const T& b);}}
|-
| 작음
| style="text-align:center;" class="nowrap" | <code>a '''<''' b</code> || {{yes}} || {{yes}}
| {{cpp|1=bool T::operator<(const T& b) const;}}
| {{cpp|1=bool operator<(const T& a, const T& b);}}
|-
| 크거나 <br/>같음
| style="text-align:center;" class="nowrap" | <code>a '''>=''' b</code> || {{yes}} || {{yes}}
| {{cpp|1=bool T::operator>=(const T& b) const;}}
| {{cpp|1=bool operator>=(const T& a, const T& b);}}
|-
| 작거나 <br/>같음
| style="text-align:center;" class="nowrap" | <code>a '''<=''' b</code> || {{yes}} || {{yes}}
| {{cpp|1=bool T::operator<=(const T& b) const;}}
| {{cpp|1=bool operator<=(const T& a, const T& b);}}
|-
|삼단 비교<ref>C++20 표준</ref>
|<code>a '''<=>''' b</code>|| {{yes}} || {{no}}
|{{cpp|1=auto T::operator<=>(const T& b) const;}}
|{{cpp|1=auto T::operator<=>(const T& a, const T& b);}}
|}

=== 논리 연산자 ===
{| class="wikitable"
! colspan="2" rowspan="2" | 연산자<br/>이름
! rowspan="2" | 구문
! rowspan="2" | 오버로드<br/>가능<ref group="참고" name="overloadable"/>
! rowspan="2" | [[C (프로그래밍 언어)|C]]에서<br/>포함됨<ref group="참고" name="c_include"/>
! colspan="2" | 프로토타입 예제
|-
! T의 멤버로서
! 외부 클래스 정의들
|- 
| colspan="2" | [[부정|논리적<br/>부정 (NOT)]]
| style="text-align:center;" class="nowrap" | <code>'''!'''a</code>|| {{yes}} || {{yes}}
| {{cpp|1=bool T::operator!() const;}}
| {{cpp|1=bool operator!(const T& a);}}
|-
| colspan="2" | [[논리곱|논리적<br/>AND]]
| style="text-align:center;" class="nowrap" | <code>a '''&amp;&amp;''' b</code> || {{yes}} || {{yes}}
| {{cpp|1=bool T::operator&&(const T& b) const;}}
| {{cpp|1=bool operator&&(const T& a, const T& b);}}
|-
| colspan="2" | [[논리합|논리적<br/>OR]]
| style="text-align:center;" class="nowrap" | <code>a '''<nowiki>||</nowiki>''' b</code> || {{yes}} || {{yes}}
| {{cpp|1=bool T::operator{{!!}}(const T& b) const;}}
| {{cpp|1=bool operator{{!!}}(const T& a, const T& b);}}
|}
연산자 && 와 || 그리고 , 는 오버로딩하지 말아야 한다.<ref>{{서적 인용|url=|제목=More Effective C++ item 7|성=scott meyers|이름=|날짜=|출판사=addison wesley|확인날짜=}}</ref> 논리 연산이 필요하다면 대신 operator bool () 을 쓰도록 하자.

=== 비트 연산자 ===
{| class="wikitable" style=" width:100%;"
! colspan="2" rowspan="2" | 연산자<br/>이름
! rowspan="2" | 구문
! rowspan="2" | 오버로드 <wbr/>가능<wbr/><ref group="참고" name="overloadable"/>
! rowspan="2" | [[C (프로그래밍 언어)|C]]에서 포함됨<ref group="참고" name="c_include"/>
! colspan="2" | 프로토타입 예제
|-
! T의 멤버로서
! 외부 클래스 정의들
|-
| colspan="2" | [[비트 연산#NOT|비트 NOT]]
| style="text-align:center;" class="nowrap" | <code>'''~'''a</code> || {{yes}} || {{yes}}
| {{cpp|1=T T::operator~() const;}}
| {{cpp|1=T operator~(const T& a);}}
|-
| colspan="2" | [[비트 연산#AND|비트<br/>AND]]
| style="text-align:center;" class="nowrap" | <code>a '''&''' b</code> || {{yes}} || {{yes}}
| {{cpp|1=T T::operator&(const T& b) const;}}
| {{cpp|1=T operator&(const T& a, const T& b);}}
|-
| colspan="2" | [[비트 연산#OR|비트<br/>OR]]
| style="text-align:center;" class="nowrap" | <code>a '''<nowiki>|</nowiki>''' b</code> || {{yes}} || {{yes}}
| {{cpp|1=T T::operator{{!}}(const T& b) const;|lang=cpp}}
| {{cpp|1=T operator{{!}}(const T& a, const T& b);|lang=cpp}}
|-
| colspan="2" | [[비트 연산#XOR|비트<br/>XOR]]
| style="text-align:center;" class="nowrap" | <code>a '''^''' b</code> || {{yes}} || {{yes}}
| {{cpp|1=T T::operator^(const T& b) const;}}
| {{cpp|1=T operator^(const T& a, const T& b);}}
|- 
| colspan="2" | 비트<br/>왼쪽<br/>시프트<ref name="비트시프트" group="참고" />
| style="text-align:center;" class="nowrap" | <code>a '''<<''' b</code> || {{yes}} || {{yes}}
| {{cpp|1=T T::operator<<(const T& b) const;}}
| {{cpp|1=T operator<<(const T& a, const T& b);}}
|-
| colspan="2" | 비트<br/>오른쪽<br/>시프트<ref name="비트시프트" group="참고" />
| style="text-align:center;" class="nowrap" | <code>a '''>>''' b</code> || {{yes}} || {{yes}}
| {{cpp|1=T T::operator>>(const T& b) const;}}
| {{cpp|1=T operator>>(const T& a, const T& b);}}
|}

=== 복합 할당 연산자 ===
{| class="wikitable" style=" width:100%;"
! colspan="2" rowspan="2" | 연산자 이름
! rowspan="2" | 구문
! rowspan="2" | 오버로드 <wbr/>가능<wbr/><ref group="참고" name="overloadable"/>
! rowspan="2" | [[C (프로그래밍 언어)|C]]에서 포함됨<ref group="참고" name="c_include"/>
! colspan="2" | 프로토타입 예제
|-
! T의 멤버로서
! 외부 클래스 정의들
|-
| colspan="2" | 덧셈 대입
| style="text-align:center;" class="nowrap" | <code>a '''+=''' b</code> || {{yes}} || {{yes}}
| {{cpp|1=T& T::operator+=(const T& b);}}
| {{cpp|1=T& operator+=(T& a, const T& b);}}
|-
| colspan="2" | 뺄셈 대입
| style="text-align:center;" class="nowrap" | <code>a '''-=''' b</code> || {{yes}} || {{yes}}
| {{cpp|1=T& T::operator-=(const T& b);}}
| {{cpp|1=T& operator-=(T& a, const T& b);}}
|-
| colspan="2" | 곱셈 대입
| style="text-align:center;" class="nowrap" | <code>a '''*=''' b</code> || {{yes}} || {{yes}}
| {{cpp|1=T& T::operator*=(const T& b);}}
| {{cpp|1=T& operator*=(T& a, const T& b);}}
|-
| colspan="2" | 나눗셈 대입
| style="text-align:center;" class="nowrap" | <code>a '''/=''' b</code> || {{yes}} || {{yes}}
| {{cpp|1=T& T::operator/=(const T& b);}}
| {{cpp|1=T& operator/=(T& a, const T& b);}}
|-
| colspan="2" | 모듈러 대입
| style="text-align:center;" class="nowrap" | <code>a '''%=''' b</code> || {{yes}} || {{yes}}
| {{cpp|1=T& T::operator%=(const T& b);}}
| {{cpp|1=T& operator%=(T& a, const T& b);}}
|-
| colspan="2" | 비트 AND 대입
| style="text-align:center;" class="nowrap" | <code>a '''&=''' b</code> || {{yes}} || {{yes}}
| {{cpp|1=T& T::operator&=(const T& b);}}
| {{cpp|1=T& operator&=(T& a, const T& b);}}
|-
| colspan="2" | 비트 OR 대입
| style="text-align:center;" class="nowrap" | <code>a '''<nowiki>|</nowiki>=''' b</code> || {{yes}} || {{yes}}
| {{cpp|1=T& T::operator{{!}}=(const T& b);|lang=cpp}}
| {{cpp|1=T& operator{{!}}=(T& a, const T& b);|lang=cpp}}
|-
| colspan="2" | 비트 XOR 대입
| style="text-align:center;" class="nowrap" | <code>a '''^=''' b</code> || {{yes}} || {{yes}}
| {{cpp|1=T& T::operator^=(const T& b);}}
| {{cpp|1=T& operator^=(T& a, const T& b);}}
|-
| colspan="2" | 비트 왼쪽 시프트 대입
| style="text-align:center;" class="nowrap" | <code>a '''<<=''' b</code> || {{yes}} || {{yes}}
| {{cpp|1=T& T::operator<<=(const T& b);}}
| {{cpp|1=T& operator<<=(T& a, const T& b);}}
|-
| colspan="2" | 비트 오른쪽 시프트 대입
| style="text-align:center;" class="nowrap" | <code>a '''>>=''' b</code> || {{yes}} || {{yes}}
| {{cpp|1=T& T::operator>>=(const T& b);}}
| {{cpp|1=T& operator>>=(T& a, const T& b);}}
|}

=== 멤버와 포인터 연산자 ===
{| class="wikitable" style=" width:100%;"
! colspan="2" rowspan="2" | 연산자 이름
! rowspan="2" | 구문
! rowspan="2" | 오버로드 <wbr/>가능<wbr/><ref group="참고" name="overloadable"/>
! rowspan="2" | [[C (프로그래밍 언어)|C]]에서 포함됨<ref group="참고" name="c_include"/>
! colspan="2" | 프로토타입 예제<ref group="참고">T, T2 및 R은 모든 자료형이다.</ref>
|-
! T의 멤버로서
! 외부 클래스 정의들
|-
| colspan="2" | 포인터 [[배열]]
| style="text-align:center;" class="nowrap" | <code>a'''['''<code>b</code>''']'''</code> || {{yes}} || {{yes}}
| {{cpp|1=R& T::operator[](const T2& b);}}<br />
| {{N/A}}
|-
| colspan="2" | 포인터<ref group="참고">주소 <code>a</code>에 할당된 객체</ref>
| style="text-align:center;" class="nowrap" | <code>'''*'''a</code> || {{yes}} || {{yes}}
| {{cpp|1=R& T::operator*();}}
| {{cpp|1=R& operator*(T& a);}}
|-
| colspan="2" | 참조<ref group="참고"><code>a</code>객체의 원본</ref>
| style="text-align:center;" class="nowrap" | <code>'''&amp;'''a</code> || {{yes}} || {{yes}}
| {{cpp|1=T* T::operator&();}}
| {{cpp|1=T* operator&(T& a);}}
|-
| colspan="2" | 포인터 <code>a</code>에 할당된 객체의 멤버 <code>b</code>
| style="text-align:center;" class="nowrap" | <code>a'''->'''b</code> || {{yes}} || {{yes}}
| {{cpp|1=R* T::operator->();}}<br />
| {{N/A}}
|-
| colspan="2" | 객체 <code>a</code>의 멤버 <code>b</code>
| style="text-align:center;" class="nowrap" | <code>a'''.'''b</code> || {{no}} || {{yes}}
| colspan="2" {{N/A}}
|-
| colspan="2" | 포인터 <code>a</code>에 할당된 객체의 멤버 <br/><code>b</code>에 할당된 멤버<ref name="화살표별" group="참고" />
| style="text-align:center;" class="nowrap" | <code>a'''->*'''b</code> || {{yes}} || {{no}}
| {{cpp|1=R T::operator->*(R);}}<ref name="메서드포인터" group="참고" />
| {{cpp|1=R operator->*(T, R);}}<ref name="메서드포인터" group="참고" />
|-
| colspan="2" | 객체 <code>a</code>의 <code>b</code>에 할당된 멤버
| style="text-align:center;" class="nowrap" | <code>a'''.*'''b</code> || {{no}} || {{no}}
| colspan="2" {{N/A}}
|}

=== 기타 연산자 ===
{| class="wikitable"
! rowspan="2" | 연산자<br/>이름
! rowspan="2" | 구문
! rowspan="2" | 오버로드<br/>가능<ref group="참고" name="overloadable"/>
! rowspan="2" | [[C (프로그래밍 언어)|C]]에서<br/>포함됨<ref group="참고" name="c_include"/>
! colspan="2" | 프로토타입 예제<ref group="참고">T, R, Arg1 및 Arg2는 모든 자료형이다.</ref>
|-
! T의 멤버로서
! 외부 클래스 정의들
|- 
| style="text-align:center;" | [[함수 (프로그래밍)|함수]] 호출<br/><ref group="참고">[[함수 개체]]를 살펴본다.</ref>
| <code>a'''('''a1, a2''')'''</code> || {{yes}} || {{yes}}
| {{cpp|1=R T::operator()(Arg1 a1, Arg2 a2, …);}}<ref group="참고">Overload may accept zero or more arguments.</ref>
| {{N/A}}
|-
| style="text-align:center;" | [[쉼표 연산자|쉼표]]
| <code>a''',''' b</code> || {{yes}} || {{yes}}
| {{cpp|1=R& T::operator,(R& b) const;}}
| {{cpp|1=R& operator,(const T& a, R& b);}}
|-
| style="text-align:center;" | [[?:|삼항<br/>연산자]]
| <code>a '''?''' b ''':''' c</code> || {{no}} || {{yes}}
| colspan="2" {{N/A}}
|-
| style="text-align:center;" | [[범위 확인 연산자#C++|범위 확인]]
| <code>a'''::'''b</code> || {{no}} || {{no}}
| colspan="2" {{N/A}}
|-
| style="text-align:center;" | [[sizeof|Size-of]]
| <code>'''sizeof'''(a)</code><ref name="sizeof" group="참고"/><br /><code>'''sizeof'''(''자료형'')</code> || {{no}} || {{yes}}
| colspan="2" {{N/A}}
|-
| style="text-align:center;" | 자료형<br/>식별
| <code>'''typeid'''(a)</code><br /><code>'''typeid'''(''자료형'')</code> || {{no}} || {{no}}
| colspan="2" {{N/A}}
|-
| style="text-align:center;" | [[형변환|캐스트]]
| <code>(''자료형'') a</code> || {{yes}} || {{yes}}
| {{cpp|1=T::operatorR() const;}}<ref group="참고">사용자 정의 변환에 대해, 반환 자료형은 절대적 및 필연적으로 연산자 이름과 일치한다.</ref>
| {{N/A}}
|-
| style="text-align:center;" | [[new (c++)|저장소<br/>할당]]
| <code>'''new''' ''자료형''</code> || {{yes}} || {{no}}
| {{cpp|1=void* T::operator new(size_t x);}}
| {{cpp|1=void* operator new(size_t x);}}
|-
| style="text-align:center;" | 저장소<br/>할당<br/>(배열)
| <code>'''new''' ''자료형'''''['''n''']'''</code> || {{yes}} || {{no}}
| {{cpp|1=void* T::operator new[](size_t x);}}
| {{cpp|1=void* operator new[](size_t x);}}
|-
| style="text-align:center;" | [[연산자 삭제|저장소<br/>할당<br/>취소]]
| <code>'''delete''' a</code> || {{yes}} || {{no}}
| {{cpp|1=void T::operator delete(void* x);}}
| {{cpp|1=void operator delete(void* x);}}
|-
| style="text-align:center;" | 저장소<br/>할당<br/>취소<br/>(배열)
| <code>'''delete[]''' a</code> || {{yes}} || {{no}}
| {{cpp|1=void T::operator delete[](void* x);}}
| {{cpp|1=void operator delete[](void* x);}}
|}

== 연산자 우선순위 ==
다음은 [[C (프로그래밍 언어)|C]]와 [[C++]] 언어에서 모든 연산자의 [[연산의 우선순위|우선순위]]와 [[연산자 결합법칙|결합법칙]]을 나열하는 표이다<ref group="참고">연산자는 또한 [[자바 (프로그래밍 언어)|자바]], [[펄]], [[PHP]] 및 많은 다른 최근 언어가 존재할 때, 우선순위는 그 주어진 것과 동일하다{{출처|날짜=2011-10-4|이유=나는 PHP가 ?: 연산자를 위한 "잘못된" 결합법칙이 있다는 것을 들었다|date=September 2011}}.</ref>. 연산자는 내림차순 우선순위에서, 위에서 아래로 나열된다. 우선순위 내림차순은 연산자와 피연산자를 묶는 행위의 우선순서를 나타낸다. 표현식을 고려해서, 어떤 행 위에 나열된 연산자는 그것의 더 아래쪽 행 위에 나열된 모든 연산자의 이전에 피연산자와 묶인다. 같은 셀에 있는 연산자<ref group="참고">여기는 셀에 나열된 연산자의 여러 행이 될 수 있다</ref>는 주어진 결합법칙의 방향대로 피연산자와 묶인다. 연산자의 우선순위는 오버로딩에 의해 영향받지 않는다. 연산자의 피연산자들이 모두 평가된 후에 그 연산자로 결과값이 계산되는 순서로 평가된다.

C와 C++에서 표현식의 구문은 [[문맥 자유 문법]]에 의해 지정된다.{{출처|날짜=2011-10-4}} 여기에 주어진 표는 문법으로부터 추론되었다.{{출처|날짜=2011-10-4}} ISO C 1999년 표준에 대해, 항목 6.5.6 주 71은 C 연산자의 우선순위를 정의하는 사양에 의해 제공되는 C 문법을 정하고, 또한 사양의 항목 순서를 밀접하게 따라가는 문법으로 인한 연산자 우선순위를 정한다:

{{인용문|[C] 구문 [즉, 문법]은 첫 번째 가장높은 우선순위, 하위조항의 주요 하위조항의 순서와 동일한, 표현식의 평가에서 연산자 우선순위를 지정한다.}}

우선순위 표는, 대부분 적절하지만, 몇 가지 세부 정보를 해결할 수 없다. 특히, [[3항 연산자]]는 그것의 중간 피연산자로서 어떤 임의의 표현식을 허용함에도 불구하고, 할당 및 쉼표 연산자보다 높은 우선순위가 있는 것으로서 나열된다는 것을 참고한다. 그러므로 <code>a ? b , c : d</code>는 <code>a ? (b, c) : d</code>로서 해석되고, <code>(a ? b), (c : d)</code>로서 무의미하지 않다. 또한, 즉시, C 캐스트 표현식의 괄호묶지않은 결과는 <code>sizeof</code>의 피연산자가 될 수 없다는 것을 참고한다. 따라서, <code>sizeof (int) * x</code>는 <code>(sizeof(int)) * x</code>으로 해석되고 <code>sizeof ((int) *x)</code>가 아니다.

{| class="wikitable"
|-
! style="text-align: left" | 우선순위
! style="text-align: left" | 연산자
! style="text-align: left" | 설명
! style="text-align: left" | 결합법칙
|-
! 1
| <code>::</code>
| 범위 확인 (C++만)
| style="vertical-align: top" rowspan="12" | 왼쪽에서 오른쪽
|-
! rowspan=11| 2
| style="border-bottom-style: none" | <code>++</code>
| style="border-bottom-style: none" | 후위 증가
|-
| style="border-bottom-style: none; border-top-style: none" | <code>--</code>
| style="border-bottom-style: none; border-top-style: none" | 후위 감소
|-
| style="border-bottom-style: none; border-top-style: none" | <code>()</code>
| style="border-bottom-style: none; border-top-style: none" | 함수 호출
|-
| style="border-bottom-style: none; border-top-style: none" | <code>[]</code>
| style="border-bottom-style: none; border-top-style: none" | 배열 첨자
|-
| style="border-bottom-style: none; border-top-style: none" | <code>.</code>
| style="border-bottom-style: none; border-top-style: none" | 참조에 의한 요소 선택
|-
| style="border-bottom-style: none; border-top-style: none" | <code>-&gt;</code>
| style="border-bottom-style: none; border-top-style: none" | 포인터를 통해 요소 선택
|-
| style="border-bottom-style: none; border-top-style: none" | <code>typeid()</code>
| style="border-bottom-style: none; border-top-style: none" | [[런타임 형식 정보]] (C++만) ([[typeid]] 참조)
|-
| style="border-bottom-style: none; border-top-style: none" | <code>const_cast</code>
| style="border-bottom-style: none; border-top-style: none" | 자료형 캐스트 (C++만) ([[const cast]] 참조)
|-
| style="border-bottom-style: none; border-top-style: none" | <code>dynamic_cast</code>
| style="border-bottom-style: none; border-top-style: none" | 자료형 캐스트 (C++만) ([[dynamic cast]] 참조)
|-
| style="border-bottom-style: none; border-top-style: none" | <code>reinterpret_cast</code>
| style="border-bottom-style: none; border-top-style: none" | 자료형 캐스트 (C++만) ([[reinterpret cast]] 참조)
|-
| style="border-top-style: none" | <code>static_cast</code>
| style="border-top-style: none" | 자료형 캐스트 (C++만) ([[static cast]] 참고)
|-
! rowspan=12| 3
| style="border-bottom-style: none" | <code>++</code>
| style="border-bottom-style: none" | 전위 증가
| style="vertical-align: top" rowspan="12" | 오른쪽에서 왼쪽
|-
| style="border-bottom-style: none; border-top-style: none" | <code>--</code>
| style="border-bottom-style: none; border-top-style: none" | 전위 감소
|-
| style="border-bottom-style: none; border-top-style: none" | <code>+</code>
| style="border-bottom-style: none; border-top-style: none" | 단항 덧셈
|-
| style="border-bottom-style: none; border-top-style: none" | <code>-</code>
| style="border-bottom-style: none; border-top-style: none" | 단항 뺄셈
|-
| style="border-bottom-style: none; border-top-style: none" | <code>!</code>
| style="border-bottom-style: none; border-top-style: none" | 논리적 NOT
|-
| style="border-bottom-style: none; border-top-style: none" | <code>~</code>
| style="border-bottom-style: none; border-top-style: none" | 비트 NOT
|-
| style="border-bottom-style: none; border-top-style: none" | <code>(''자료형'')</code>
| style="border-bottom-style: none; border-top-style: none" | 자료형 캐스트
|-
| style="border-bottom-style: none; border-top-style: none" | <code>*</code>
| style="border-bottom-style: none; border-top-style: none" | 우회 (역참조)
|-
| style="border-bottom-style: none; border-top-style: none" | <code>&</code>
| style="border-bottom-style: none; border-top-style: none" | 의-주소
|-
| style="border-bottom-style: none; border-top-style: none" | <code>sizeof</code>
| style="border-bottom-style: none; border-top-style: none" | [[sizeof|의-크기]]
|-
| style="border-bottom-style: none; border-top-style: none" | <code>new</code>, <code>new[]</code>
| style="border-bottom-style: none; border-top-style: none" | 동적 메모리 할당 (C++만)
|-
| style="border-top-style: none" | <code>delete</code>, <code>delete[]</code>
| style="border-top-style: none" | 동적 메모리 할당해제 (C++만)
|-
! rowspan=2| 4
| style="border-bottom-style: none | <code>.*</code>
| style="border-bottom-style: none | 멤버접근 포인터 (C++만)
| rowspan="21" style="vertical-align: top" | 왼쪽에서 오른쪽
|-
| style="border-bottom-style: none; border-top-style: none" | <code>->*</code>
| style="border-bottom-style: none; border-top-style: none" | 멤버접근 포인터 (C++만)
|-
! rowspan=3| 5
| style="border-bottom-style: none | <code>*</code>
| style="border-bottom-style: none | 곱셈
|-
| style="border-bottom-style: none; border-top-style: none" | <code>/</code>
| style="border-bottom-style: none; border-top-style: none" | 나눗셈
|-
| style="border-bottom-style: none; border-top-style: none" | <code>%</code>
| style="border-bottom-style: none; border-top-style: none" | [[모듈러 연산|계수]] (나머지)
|-
! rowspan=2| 6
| style="border-bottom-style: none | <code>+</code>
| style="border-bottom-style: none | 덧셈
|-
| style="border-bottom-style: none; border-top-style: none" | <code>-</code>
| style="border-bottom-style: none; border-top-style: none" | 뺄셈
|-
! rowspan=2| 7
| style="border-bottom-style: none | <code>&lt;&lt;</code>
| style="border-bottom-style: none | [[비트 연산|비트]] 왼쪽 시프트
|-
| style="border-bottom-style: none; border-top-style: none" | <code>&gt;&gt;</code>
| style="border-bottom-style: none; border-top-style: none" | [[비트 연산|비트]] 오른쪽 시프트
|-
!8
|<code><=&gt;</code>
|삼단 비교
|-
! rowspan="4" | 9
| style="border-bottom-style: none" |<code>&lt;</code>
| style="border-bottom-style: none" |[[관계형 연산자|관계적 연산자들]]에 대해 < 각각의
|-
| style="border-bottom-style: none; border-top-style: none" | <code>&lt;=</code>
| style="border-bottom-style: none; border-top-style: none" | 관계적 연산자들에 대해 ≤ 각각의
|-
| style="border-bottom-style: none; border-top-style: none" | <code>&gt;</code>
| style="border-bottom-style: none; border-top-style: none" | 관계적 연산자들에 대해 > 각각의
|-
| style="border-bottom-style: none; border-top-style: none" | <code>&gt;=</code>
| style="border-bottom-style: none; border-top-style: none" | 관계적 연산자들에 대해 ≥ 각각의
|-
! rowspan=2| 10
| style="border-bottom-style: none | <code>==</code>
| style="border-bottom-style: none | [[관계형 연산자#대등|관계적 =]] 각각의
|-
| style="border-bottom-style: none; border-top-style: none" | <code>!=</code>
| style="border-bottom-style: none; border-top-style: none" | 관계적 ≠ 각각의
|-
! 11
| <code>&amp;</code>
| 비트 AND
|-
! 12
| <code>^</code>
| 비트 XOR (배타적 or)
|-
! 13
| <code><nowiki>|</nowiki></code>
| 비트 OR (포함적 or)
|-
! 14
| <code>&amp;&amp;</code>
| 논리 AND
|-
! 15
| <code><nowiki>||</nowiki></code>
| 논리 OR
|-
! 16
| <code>?:</code>
| [[3항 연산자|3항 연산자]] 조건부 ([[?:]] 참조)
| style="vertical-align: top" rowspan="12" | 오른쪽에서 왼쪽
|-
! rowspan=11| 17
| style="border-bottom-style: none" | <code>=</code>
| style="border-bottom-style: none" | 직접 할당 [[C++에서 할당 연산자|(C++ 클래스를 위해 기본적으로 제공됨)]]
|-
| style="border-bottom-style: none; border-top-style: none" | <code>+=</code>
| style="border-bottom-style: none; border-top-style: none" | 덧셈에 의한 할당
|-
| style="border-bottom-style: none; border-top-style: none" | <code>-=</code>
| style="border-bottom-style: none; border-top-style: none" | 뺄셈에 의한 할당
|-
| style="border-bottom-style: none; border-top-style: none" | <code>*=</code>
| style="border-bottom-style: none; border-top-style: none" | 곱셈에 의한 할당
|-
| style="border-bottom-style: none; border-top-style: none" | <code>/=</code>
| style="border-bottom-style: none; border-top-style: none" | 나눗셈에 의한 할당
|-
| style="border-bottom-style: none; border-top-style: none" | <code>%=</code>
| style="border-bottom-style: none; border-top-style: none" | 나머지에 의한 할당
|-
| style="border-bottom-style: none; border-top-style: none" | <code>&lt;&lt;=</code>
| style="border-bottom-style: none; border-top-style: none" | 비트 왼쪽 시프트에 의한 할당
|-
| style="border-bottom-style: none; border-top-style: none" | <code>&gt;&gt;=</code>
| style="border-bottom-style: none; border-top-style: none" | 비트 오른쪽 시프트에 의한 할당
|-
| style="border-bottom-style: none; border-top-style: none" | <code>&amp;=</code>
| style="border-bottom-style: none; border-top-style: none" | 비트 AND에 의한 할당
|-
| style="border-bottom-style: none; border-top-style: none" | <code>^=</code>
| style="border-bottom-style: none; border-top-style: none" | 비트 XOR에 의한 할당
|-
| style="border-bottom-style: none; border-top-style: none" | <code><nowiki>|</nowiki>=</code>
| style="border-bottom-style: none; border-top-style: none" | 비트 OR에 의한 할당
|-
! 18
| <code>throw</code>
| 던지기 연산자 (던지기 예외, C++만)
|
|-
! 19
| <code>,</code>
| [[쉼표 연산자|쉼표]]
| 왼쪽에서 오른쪽
|}

=== 참고 사항 ===
우선순위 표는 명시적으로 괄호에 의해 지정되지 않을 때, 체인화된 표현식들에서 바인딩의 순서를 결정한다.

* 예를 들어, <code>++x*3</code>은 얼핏 보면 모호해 보이지만, 우선순위 표에 따르면 <code>x</code>는 <code>*</code>연산자보다 전위 <code>++</code>연산자를 더 우선시하고, 따라서 <code>++x</code> 연산을 수행한 후에 <code>x*3</code> 연산을 수행하게 된다.
* <code>3*x++</code>도 마찬가지로, 후위 <code>++</code>연산자가 가장 나중에 실행될 것처럼 보이지만, 우선순위에 따라 <code>x++</code> 연산을 먼저 수행하게 된다. 그러나 <code>x++</code> 연산은 후위 연산자라서 변수의 값을 사용 후에 증가시키므로, 결국 출력값은 <code>x*3</code>으로 출력이 된 후에, x값이 증가한다.
[[파일:Precedence 2.png|right|섬네일|우선순위 및 바인딩]]
* 우선순위 또는 바인딩의 문제를 추상화한, 오른쪽 그림을 보자. 컴파일러의 직업은 여러 <code>y</code>에게 바인딩으로 경쟁하는 단항 연산자들<ref group="참고">이것들을 <code>3+( . ), 2*( . ), ( . )++, ( . )[ i ]</code>이라고 부른다.</ref>중 하나인, 표현식으로 도표를 해결하는 것이다. 우선순위 표의 순서는 각 행동에 대한 최종 하위-표현식들로 해결된다: <code>( . )[ i ]</code>은 오직 <code>y</code>에 대해 작동하고, <code>( . )++</code>은 오직 <code>y[i]</code>에 대해 작동하고, <code>2*( . )</code>은 오직 <code>y[i]++</code>에 대해 작동하고 <code>3+( . )</code>은 '오직' <code>2*((y[i])++)</code>에 대해 작동한다. 어떤 하위 표현식이 우선순위 표에서 명확한 각 연산자에 의해서 작동되지만 각 연산자의 행위가 우선순위 표에 의해결되지 않을 때를 참고하는 것은 중요하다; 이 예제에서, <code>( . )++</code> 연산자는 오직 우선순위 규칙에 의해 <code>y[i]</code>에서 작동하지만 단독 바인딩 수준들은 후위 연산자 ++의 타이밍을 표시하지 않는다<ref group="참고">( . )++ 연산자는 오직 <code>y[i]</code>이 표현식에서 평가된 후에 영향을 끼친다.</ref>.

다중-문자 순서들을 포함하고 있는 연산자의 대부분은 각 문자의 연산자 이름에서 내장된 "이름"이 주어진다. 예를 들어, <code>+=</code> 및 <code>-=</code>은 더 자세한 "덧셈에 의한 할당" 및 "뺄셈에 의한 할당" 대신에, '덧셈 등호(들)' 및 '뺄셈 등호(들)'이라고 자주 부른다.

C와 C++에서 연산자의 바인딩은 (해당 규칙에서)오히려 우선순위 표보다, 인수분해된 언어 문법에 의해 지정된다. 이것은 몇 가지 미묘한 갈등을 만든다. 예를 들어, C에서, 조건부 표현식에 대한 구문은:

 논리적 OR 표현식 ? [[표현식]] : 조건부-표현

하지만 C++에서 그것은:

 논리적 OR 표현식 ? [[표현식]] : 할당-표현

따라서 표현식:
<syntaxhighlight lang="text">
e = a < d ? a++ : a = d
</syntaxhighlight>
은 두 언어에서 다르게 분석되었다. C에서, 이 표현은 구문 오류이지만, 많은 컴파일러는 그것을 이와 같이 분석한다:
{{cpp|1=
e = ((a < d ? a++ : a) = d)
}}
lvalue가 아닌 조건 표현식(<code>a++</code>일 수 있다)의 결과 때문에, 이것은 의미론적 오류이다. C++에서, 그것은 이와 같이 분석한다:
{{cpp|1=
e = (a < d ? a++ : (a = d))
}}
그리고 그것은 올바른 표현식이다.

비트 논리 연산자의 우선순위는 비판받고 있다.<ref>{{웹 인용 |url=http://cm.bell-labs.com/cm/cs/who/dmr/chist.html |제목=보관된 사본 |확인날짜=2011-10-04 |archive-date=2013-06-22 |archive-url=https://www.webcitation.org/6HZA6qfVb?url=http://cm.bell-labs.com/cm/cs/who/dmr/chist.html |url-status=dead }}</ref> 개념적으로, <code>&</code>와 <code>|</code>은 <code>+</code>와 <code>*</code>같이 산술 연산자이다.

표현식 <code>a & b == 7</code>은 <code>a & (b == 7)</code>로 분석했던 반면 표현식 <code>a + b == 7</code>은 구문적으로 <code>(a + b) == 7</code>로 분석했다. 이것은 그들이 다른방법으로 했던 것보다 더 자주 사용되는 괄호가 필요하다.

=== C++ 연산자 동의어 ===
C++는 연산자들의 숫자에 대한 별명으로서 작동하는 키워드를 정의한다:<ref>{{서적 인용
  | author = [http://www.open-std.org/jtc1/sc22/wg21/ ISO/IEC JTC1/SC22/WG21 - C++ 표준 위원회]
  | title = ISO/IEC 14882:1998(E) 프로그래밍 언어 C++
  | date = 1998년 9월 1일
  | publisher  = 프로그래밍 언어 C++에 대한 국제 표준화 작업 단체
  | pages = 40–41
  }}</ref>
<code>and (&&), bitand (&), and_eq (&=), or (||), bitor (|), or_eq (|=), xor (^), xor_eq (^=), not (!), not_eq (!=), compl (~)</code>. 그것들은 그들이 각 연산자의 ''이름'' (문자 열)에 대한 간단한 텍스트 별명을 제외한, 다른 이름 아래에서 연산자가 같지 않음으로 그들이 대체하는 상징으로서 같은 방법을 정확하게 사용될 수 있다. 예를 들어, <code>bitand</code>는 비트 연산자뿐만 아니라 address-of 연산자를 대체하는 데 사용될 수 있고, 그것이 심지어 참조 자료형들을 지정하는 데 사용될 수 있다.
{{cpp|1=int bitand ref = n;}}

ANSI C 사양은 헤더 파일 <code>[[iso646.h]]</code>에서 전처리 매크로로 이러한 키워드에 대한 허용을 만든다. C와의 호환성을 위해, C++는 헤더 <code>[[ciso646]]</code>을 제공하고, 또한#include<ciso646.h>는 효과가 없다.

== 참고 문헌 ==
* {{서적 인용 | url = http://www.slac.stanford.edu/BFROOT/www/Computing/Programming/C++/Coronado_tutorial/v2.2/tutorial1/tabcont.txt | title = C++ Tutor | publisher = Coronado Enterprises | first = Gordon | last = Dodrill | date = 1992-01-20 | accessdate = 2010-03-08 | 보존url = https://web.archive.org/web/20080821132224/http://www.slac.stanford.edu/BFROOT/www/Computing/Programming/C++/Coronado_tutorial/v2.2/tutorial1/tabcont.txt | 보존날짜 = 2008-08-21 | url-status = dead }}

== 각주 ==
=== 출처주 ===
{{각주}}
=== 내용주 ===
{{각주|2|group="참고"|refs=
<ref name="비트시프트" group="참고">[[iostream]]의 문맥에서, 저자는 각각, “put-to” 또는 "스트림 삽입" 및 “get-from” 또는 "스트림 추출" 연산자로서 <code><nowiki><<</nowiki></code> 및 <code><nowiki>>></nowiki></code>를 자주 참조할 것이다.</ref>
<ref name="화살표별" group="참고">예제는 스캇 마이어스의 "스마트 포인터를 위한 ->* 연산자 구현하기"에서 찾을 수 있다.</ref>
<ref name="메서드포인터" group="참고">->* 연산자가 있는 곳의 경우에는 기본적 구현처럼 작동하고, R 매개변수는 클래스 T의 메서드에서 메서드 포인터가 될 것이고 반환 값은 메서드 매개변수와 함께(오직) 호출될 것을 준비하는 함수 개체의 몇몇 종류가 될 것이다.</ref>
<ref name="sizeof" group="참고">괄호들은 자료형의 크기를 받을 때에만, 값의 크기를 받을 때는 필요하지 않다. 그러나, 그들은 보통 관계없이 사용된다.
</ref>
}}
== 외부 링크 ==
* [http://cppreference.com/wiki/language/operators C++ 연산자]
* [http://msdn.microsoft.com/en-us/library/e1e3921c(VS.80).aspx C와 C++에서 전위 연산자 대 후위 연산자]
* [https://web.archive.org/web/20110924093643/http://www.allcompiler.com/2011/07/operators-in-c.html C 프로그래밍에서 연산자]

{{C 프로그래밍 언어}}
{{C++}}

[[분류:C 프로그래밍 언어]]
[[분류:C++]]
[[분류:연산자 (프로그래밍)]]