C와 C++의 연산자

en:Operators in C and C++ 이것은 C와 C++ 프로그래밍 언어의 연산자의 목록이다. 나열된 모든 연산자는 C++에 존재한다. 네번째 열("C에 포함됨")은 해당 연산자가 C에 존재하는지를 표시한다. C는 연산자 오버로딩을 지원하지 않는다. 연산자가 오버로드되지 않았다면, `&&`, `||`, `,`(쉼표 연산자) 연산자는 첫 번째 피연산자(operand)가 평가된 시점이 시퀀스 포인트이다. C++는 형 변환 연산자인 `const_cast`, `static_cast`, `dynamic_cast`, `reinterpret_cast`를 포함한다. 이들 연산자의 서식은 우선순위 단계가 중요하지 않다는 것을 의미한다. C와 C++에서 사용 가능한 연산자 중 대부분은 C#, 자바, 펄, 그리고 PHP와 같은 다른 언어에서도 동일한 우선순위, 결합법칙, 의미론으로 사용가능하다.
# 연산자 표
이 표에서 `a`, `b`, `c`는 경우에 따라 유효한 값(리터럴, 변수 값, 반환 값), 개체 이름, 왼쪽 값(lvalue)을 나타낸다. `R`, `S`, `T`는 자료형을 나타내고 `K`는 클래스나 열거형을 나타낸다.
## 산술 연산자
{| class="wikitable" ! colspan="2" rowspan="2" | 연산자 이름 ! rowspan="2" | 구문 ! rowspan="2" | 오버로드 가능연산자가 C++에서 오버로드 가능한(*overloadable*) 것을 의미한다. ! rowspan="2" | C에 포함됨C에서 연산자가 있고 의미론적 의미를 가지는 것을 의미한다.(C는 연산자 오버로딩을 지원하지 않는다.) |- ! T의 멤버로서 ! 외부 클래스 정의들 |- | colspan="2" | 대입 | | `a **=** b` || yes || yes | 1=T& T::operator=(const T& b); | N/A |- | colspan="2" | 덧셈 | | `a **+** b` || yes || yes | 1=T T::operator+(const T& b) const; | 1=T operator+(const T& a, const T& b); |- | colspan="2" | 뺄셈 | | `a **-** b` || yes || yes | 1=T T::operator-(const T& b) const; | 1=T operator-(const T& a, const T& b); |- | colspan="2" | 단항 덧셈
(정수 승급) | | `**+**a` || yes || yes | 1=T T::operator+() const; | 1=T operator+(const T& a); |- | colspan="2" | 단항 뺄셈
(반수) | | `**-**a` || yes || yes | 1=T T::operator-() const; | 1=T operator-(const T& a); |- | colspan="2" | 곱셈 | | `a ***** b` || yes || yes | 1=T T::operator*(const T& b) const; | 1=T operator*(const T &a;, const T& b); |- | colspan="2" | 나눗셈 | | `a **/** b` || yes || yes | 1=T T::operator/(const T& b) const; | 1=T operator/(const T& a, const T& b); |- | colspan="2" | 모듈러 (나머지) | | `a **%** b` || yes || yes | 1=T T::operator%(const T& b) const; | 1=T operator%(const T& a, const T& b); |- | rowspan="2" | 증가 | 전위 | | `**++**a` || yes || yes | 1=T& T::operator++(); | 1=T& operator++(T& a); |- | 후위 | | `a**++**` | yes | yes | 1=T T::operator++(int);C++는 전위 및 후위 사이의 증가 연산자를 구별하는 이름없는 더미 매개변수 `int`를 사용한다. | 1=T operator++(T& a, int); |- | rowspan="2" | 감소 | 전위 | | `**--**a` || yes || yes | 1=T& T::operator--(); | 1=T& operator--(T& a); |- | 후위 | | `a**--**` || rowspan="2" yes || rowspan="2" yes | 1=T T::operator--(int); | 1=T operator--(T& a, int); |}
## 비교 연산자/관계 연산자
{| class="wikitable" ! rowspan="2" | 연산자 이름 ! rowspan="2" | 구문 ! rowspan="2" | 오버로드
가능 ! rowspan="2" | C에서
포함됨 ! colspan="2" | 프로토타입 예제 |- ! T의 멤버로서 ! 외부 클래스 정의들 |- | 같음 | | `a **==** b` || yes || yes | 1=bool T::operator==(const T& b) const; | 1=bool operator==(const T& a, const T& b); |- | 같지 않음 | | `a **!=** b` || yes || yes | 1=bool T::operator!=(const T& b) const; | 1=bool operator!=(const T& a, const T& b); |- | 큼 | | `a **>** b` || yes || yes | 1=bool T::operator>(const T& b) const; | 1=bool operator>(const T& a, const T& b); |- | 작음 | | `a **=** b` || yes || yes | 1=bool T::operator>=(const T& b) const; | 1=bool operator>=(const T& a, const T& b); |- | 작거나
같음 | | `a *'*' b`|| yes || no |1=auto T::operator(const T& b) const; |1=auto T::operator(const T& a, const T& b); |}
## 논리 연산자
{| class="wikitable" ! colspan="2" rowspan="2" | 연산자
이름 ! rowspan="2" | 구문 ! rowspan="2" | 오버로드
가능 ! rowspan="2" | C에서
포함됨 ! colspan="2" | 프로토타입 예제 |- ! T의 멤버로서 ! 외부 클래스 정의들 |- | colspan="2" | 논리적
부정 (NOT) | | `**!**a`|| yes || yes | 1=bool T::operator!() const; | 1=bool operator!(const T& a); |- | colspan="2" | 논리적
AND | | `a **&&** b` || yes || yes | 1=bool T::operator&&(const T& b) const; | 1=bool operator&&(const T& a, const T& b); |- | colspan="2" | 논리적
OR | | `a **||** b` || yes || yes | 1=bool T::operator!!(const T& b) const; | 1=bool operator!!(const T& a, const T& b); |} 연산자 && 와 || 그리고 , 는 오버로딩하지 말아야 한다.확인날짜= 논리 연산이 필요하다면 대신 operator bool () 을 쓰도록 하자.
## 비트 연산자
{| class="wikitable" | 연산자
이름 ! rowspan="2" | 구문 ! rowspan="2" | 오버로드 가능 ! rowspan="2" | C에서 포함됨 ! colspan="2" | 프로토타입 예제 |- ! T의 멤버로서 ! 외부 클래스 정의들 |- | colspan="2" | 비트 NOT | | `**~**a` || yes || yes | 1=T T::operator~() const; | 1=T operator~(const T& a); |- | colspan="2" | 비트
AND | | `a **&** b` || yes || yes | 1=T T::operator&(const T& b) const; | 1=T operator&(const T& a, const T& b); |- | colspan="2" | 비트
OR | | `a **|** b` || yes || yes | lang=cpp | lang=cpp |- | colspan="2" | 비트
XOR | | `a **^** b` || yes || yes | 1=T T::operator^(const T& b) const; | 1=T operator^(const T& a, const T& b); |- | colspan="2" | 비트
왼쪽
시프트 | | `a **>** b` || yes || yes | 1=T T::operator>>(const T& b) const; | 1=T operator>>(const T& a, const T& b); |}
## 복합 할당 연산자
{| class="wikitable" | 연산자 이름 ! rowspan="2" | 구문 ! rowspan="2" | 오버로드 가능 ! rowspan="2" | C에서 포함됨 ! colspan="2" | 프로토타입 예제 |- ! T의 멤버로서 ! 외부 클래스 정의들 |- | colspan="2" | 덧셈 대입 | | `a **+=** b` || yes || yes | 1=T& T::operator+=(const T& b); | 1=T& operator+=(T& a, const T& b); |- | colspan="2" | 뺄셈 대입 | | `a **-=** b` || yes || yes | 1=T& T::operator-=(const T& b); | 1=T& operator-=(T& a, const T& b); |- | colspan="2" | 곱셈 대입 | | `a ***=** b` || yes || yes | 1=T& T::operator*=(const T& b); | 1=T& operator*=(T& a, const T& b); |- | colspan="2" | 나눗셈 대입 | | `a **/=** b` || yes || yes | 1=T& T::operator/=(const T& b); | 1=T& operator/=(T& a, const T& b); |- | colspan="2" | 모듈러 대입 | | `a **%=** b` || yes || yes | 1=T& T::operator%=(const T& b); | 1=T& operator%=(T& a, const T& b); |- | colspan="2" | 비트 AND 대입 | | `a **&=** b` || yes || yes | 1=T& T::operator&=(const T& b); | 1=T& operator&=(T& a, const T& b); |- | colspan="2" | 비트 OR 대입 | | `a **|=** b` || yes || yes | lang=cpp | lang=cpp |- | colspan="2" | 비트 XOR 대입 | | `a **^=** b` || yes || yes | 1=T& T::operator^=(const T& b); | 1=T& operator^=(T& a, const T& b); |- | colspan="2" | 비트 왼쪽 시프트 대입 | | `a **>=** b` || yes || yes | 1=T& T::operator>>=(const T& b); | 1=T& operator>>=(T& a, const T& b); |}
## 멤버와 포인터 연산자
{| class="wikitable" | 연산자 이름 ! rowspan="2" | 구문 ! rowspan="2" | 오버로드 가능 ! rowspan="2" | C에서 포함됨 ! colspan="2" | 프로토타입 예제T, T2 및 R은 모든 자료형이다. |- ! T의 멤버로서 ! 외부 클래스 정의들 |- | colspan="2" | 포인터 배열 | | `a**[**`b`**]**` || yes || yes | 1=R& T::operator[](const T2& b);
| N/A |- | colspan="2" | 포인터주소 `a`에 할당된 객체 | | `*****a` || yes || yes | 1=R& T::operator*(); | 1=R& operator*(T& a); |- | colspan="2" | 참조`a`객체의 원본 | | `**&**a` || yes || yes | 1=T* T::operator&(); | 1=T* operator&(T& a); |- | colspan="2" | 포인터 `a`에 할당된 객체의 멤버 `b` | | `a**->**b` || yes || yes | 1=R* T::operator->();
| N/A |- | colspan="2" | 객체 `a`의 멤버 `b` | | `a**.**b` || no || yes | colspan="2" N/A |- | colspan="2" | 포인터 `a`에 할당된 객체의 멤버
`b`에 할당된 멤버 | | `a**->***b` || yes || no | 1=R T::operator->*(R); | 1=R operator->*(T, R); |- | colspan="2" | 객체 `a`의 `b`에 할당된 멤버 | | `a**.***b` || no || no | colspan="2" N/A |}
## 기타 연산자
{| class="wikitable" ! rowspan="2" | 연산자
이름 ! rowspan="2" | 구문 ! rowspan="2" | 오버로드
가능 ! rowspan="2" | C에서
포함됨 ! colspan="2" | 프로토타입 예제T, R, Arg1 및 Arg2는 모든 자료형이다. |- ! T의 멤버로서 ! 외부 클래스 정의들 |- | | 함수 호출
함수 개체를 살펴본다. | `a**(**a1, a2**)**` || yes || yes | 1=R T::operator()(Arg1 a1, Arg2 a2, …);Overload may accept zero or more arguments. | N/A |- | | 쉼표 | `a**,** b` || yes || yes | 1=R& T::operator,(R& b) const; | 1=R& operator,(const T& a, R& b); |- | | 삼항
연산자 | `a **?** b **:** c` || no || yes | colspan="2" N/A |- | | 범위 확인 | `a**::**b` || no || no | colspan="2" N/A |- | | Size-of | `**sizeof**(a)`
`**sizeof**(*자료형*)` || no || yes | colspan="2" N/A |- | | 자료형
식별 | `**typeid**(a)`
`**typeid**(*자료형*)` || no || no | colspan="2" N/A |- | | 캐스트 | `(*자료형*) a` || yes || yes | 1=T::operatorR() const;사용자 정의 변환에 대해, 반환 자료형은 절대적 및 필연적으로 연산자 이름과 일치한다. | N/A |- | | 저장소
할당 | `**new** *자료형*` || yes || no | 1=void* T::operator new(size_t x); | 1=void* operator new(size_t x); |- | | 저장소
할당
(배열) | `**new** *자료형***[**n**]**` || yes || no | 1=void* T::operator new[](size_t x); | 1=void* operator new[](size_t x); |- | | 저장소
할당
취소 | `**delete** a` || yes || no | 1=void T::operator delete(void* x); | 1=void operator delete(void* x); |- | | 저장소
할당
취소
(배열) | `**delete[]** a` || yes || no | 1=void T::operator delete[](void* x); | 1=void operator delete[](void* x); |}
# 연산자 우선순위
다음은 C와 C++ 언어에서 모든 연산자의 우선순위와 결합법칙을 나열하는 표이다연산자는 또한 자바, 펄, PHP 및 많은 다른 최근 언어가 존재할 때, 우선순위는 그 주어진 것과 동일하다date=September 2011.. 연산자는 내림차순 우선순위에서, 위에서 아래로 나열된다. 우선순위 내림차순은 연산자와 피연산자를 묶는 행위의 우선순서를 나타낸다. 표현식을 고려해서, 어떤 행 위에 나열된 연산자는 그것의 더 아래쪽 행 위에 나열된 모든 연산자의 이전에 피연산자와 묶인다. 같은 셀에 있는 연산자여기는 셀에 나열된 연산자의 여러 행이 될 수 있다는 주어진 결합법칙의 방향대로 피연산자와 묶인다. 연산자의 우선순위는 오버로딩에 의해 영향받지 않는다. 연산자의 피연산자들이 모두 평가된 후에 그 연산자로 결과값이 계산되는 순서로 평가된다. C와 C++에서 표현식의 구문은 문맥 자유 문법에 의해 지정된다.날짜=2011-10-4 여기에 주어진 표는 문법으로부터 추론되었다.날짜=2011-10-4 ISO C 1999년 표준에 대해, 항목 6.5.6 주 71은 C 연산자의 우선순위를 정의하는 사양에 의해 제공되는 C 문법을 정하고, 또한 사양의 항목 순서를 밀접하게 따라가는 문법으로 인한 연산자 우선순위를 정한다: [C] 구문 [즉, 문법]은 첫 번째 가장높은 우선순위, 하위조항의 주요 하위조항의 순서와 동일한, 표현식의 평가에서 연산자 우선순위를 지정한다. 우선순위 표는, 대부분 적절하지만, 몇 가지 세부 정보를 해결할 수 없다. 특히, 3항 연산자는 그것의 중간 피연산자로서 어떤 임의의 표현식을 허용함에도 불구하고, 할당 및 쉼표 연산자보다 높은 우선순위가 있는 것으로서 나열된다는 것을 참고한다. 그러므로 `a ? b , c : d`는 `a ? (b, c) : d`로서 해석되고, `(a ? b), (c : d)`로서 무의미하지 않다. 또한, 즉시, C 캐스트 표현식의 괄호묶지않은 결과는 `sizeof`의 피연산자가 될 수 없다는 것을 참고한다. 따라서, `sizeof (int) * x`는 `(sizeof(int)) * x`으로 해석되고 `sizeof ((int) *x)`가 아니다. {| class="wikitable" |- ! | 우선순위 ! | 연산자 ! | 설명 ! | 결합법칙 |- ! 1 | `::` | 범위 확인 (C++만) | | 왼쪽에서 오른쪽 |- ! rowspan=11| 2 | | `++` | | 후위 증가 |- | | `--` | | 후위 감소 |- | | `()` | | 함수 호출 |- | | `[]` | | 배열 첨자 |- | | `.` | | 참조에 의한 요소 선택 |- | | `->` | | 포인터를 통해 요소 선택 |- | | `typeid()` | | 런타임 형식 정보 (C++만) (typeid 참조) |- | | `const_cast` | | 자료형 캐스트 (C++만) (const cast 참조) |- | | `dynamic_cast` | | 자료형 캐스트 (C++만) (dynamic cast 참조) |- | | `reinterpret_cast` | | 자료형 캐스트 (C++만) (reinterpret cast 참조) |- | | `static_cast` | | 자료형 캐스트 (C++만) (static cast 참고) |- ! rowspan=12| 3 | | `++` | | 전위 증가 | | 오른쪽에서 왼쪽 |- | | `--` | | 전위 감소 |- | | `+` | | 단항 덧셈 |- | | `-` | | 단항 뺄셈 |- | | `!` | | 논리적 NOT |- | | `~` | | 비트 NOT |- | | `(*자료형*)` | | 자료형 캐스트 |- | | `*` | | 우회 (역참조) |- | | `&` | | 의-주소 |- | | `sizeof` | | 의-크기 |- | | `new`, `new[]` | | 동적 메모리 할당 (C++만) |- | | `delete`, `delete[]` | | 동적 메모리 할당해제 (C++만) |- ! rowspan=2| 4 | | `.*` | | 멤버접근 포인터 (C++만) | rowspan="21" | 왼쪽에서 오른쪽 |- | | `->*` | | 멤버접근 포인터 (C++만) |- ! rowspan=3| 5 | | `*` | | 곱셈 |- | | `/` | | 나눗셈 |- | | `%` | | 계수 (나머지) |- ! rowspan=2| 6 | | `+` | | 덧셈 |- | | `-` | | 뺄셈 |- ! rowspan=2| 7 | | `>` | | 비트 오른쪽 시프트 |- !8 |`` |삼단 비교 |- ! rowspan="4" | 9 | |`` | | 관계적 연산자들에 대해 > 각각의 |- | | `>=` | | 관계적 연산자들에 대해 ≥ 각각의 |- ! rowspan=2| 10 | | `==` | | 관계적 = 각각의 |- | | `!=` | | 관계적 ≠ 각각의 |- ! 11 | `&` | 비트 AND |- ! 12 | `^` | 비트 XOR (배타적 or) |- ! 13 | `|` | 비트 OR (포함적 or) |- ! 14 | `&&` | 논리 AND |- ! 15 | `||` | 논리 OR |- ! 16 | `?:` | 3항 연산자 조건부 (?: 참조) | | 오른쪽에서 왼쪽 |- ! rowspan=11| 17 | | `=` | | 직접 할당 (C++ 클래스를 위해 기본적으로 제공됨) |- | | `+=` | | 덧셈에 의한 할당 |- | | `-=` | | 뺄셈에 의한 할당 |- | | `*=` | | 곱셈에 의한 할당 |- | | `/=` | | 나눗셈에 의한 할당 |- | | `%=` | | 나머지에 의한 할당 |- | | `>=` | | 비트 오른쪽 시프트에 의한 할당 |- | | `&=` | | 비트 AND에 의한 할당 |- | | `^=` | | 비트 XOR에 의한 할당 |- | | `|=` | | 비트 OR에 의한 할당 |- ! 18 | `throw` | 던지기 연산자 (던지기 예외, C++만) | |- ! 19 | `,` | 쉼표 | 왼쪽에서 오른쪽 |} =
## C++ 연산자 동의어
C++는 연산자들의 숫자에 대한 별명으로서 작동하는 키워드를 정의한다:pages = 40–41 `and (&&), bitand (&), and_eq (&=), or (||), bitor (|), or_eq (|=), xor (^), xor_eq (^=), not (!), not_eq (!=), compl (~)`. 그것들은 그들이 각 연산자의 *이름* (문자 열)에 대한 간단한 텍스트 별명을 제외한, 다른 이름 아래에서 연산자가 같지 않음으로 그들이 대체하는 상징으로서 같은 방법을 정확하게 사용될 수 있다. 예를 들어, `bitand`는 비트 연산자뿐만 아니라 address-of 연산자를 대체하는 데 사용될 수 있고, 그것이 심지어 참조 자료형들을 지정하는 데 사용될 수 있다. 1=int bitand ref = n; ANSI C 사양은 헤더 파일 `iso646.h`에서 전처리 매크로로 이러한 키워드에 대한 허용을 만든다. C와의 호환성을 위해, C++는 헤더 `ciso646`을 제공하고, 또한#include는 효과가 없다.
## 출처주
각주
## 내용주
refs= iostream의 문맥에서, 저자는 각각, “put-to” 또는 "스트림 삽입" 및 “get-from” 또는 "스트림 추출" 연산자로서 `>`를 자주 참조할 것이다. 예제는 스캇 마이어스의 "스마트 포인터를 위한 ->* 연산자 구현하기"에서 찾을 수 있다. ->* 연산자가 있는 곳의 경우에는 기본적 구현처럼 작동하고, R 매개변수는 클래스 T의 메서드에서 메서드 포인터가 될 것이고 반환 값은 메서드 매개변수와 함께(오직) 호출될 것을 준비하는 함수 개체의 몇몇 종류가 될 것이다. 괄호들은 자료형의 크기를 받을 때에만, 값의 크기를 받을 때는 필요하지 않다. 그러나, 그들은 보통 관계없이 사용된다.