This is a list of operators in the C and C++ programming languages. All the operators (except typeof) listed exist in C++; the column "Included in C", states whether an operator is also present in C. Note that C does not support operator overloading.

When not overloaded, for the operators &&, ||, and , (the comma operator), there is a sequence point after the evaluation of the first operand.

C++ also contains the type conversion operators const_cast, static_cast, dynamic_cast, and reinterpret_cast. The formatting of these operators means that their precedence level is unimportant.

Most of the operators available in C and C++ are also available in other C-family languages such as C#, D, Java, Perl, and PHP with the same precedence, associativity, and semantics.

Table
For the purposes of these tables, a, b, and c represent valid values (literals, values from variables, or return value), object names, or lvalues, as appropriate. R, S and T stand for any type(s), and K for a class type or enumerated type.

Arithmetic operators

All arithmetic operators exist in C and C++ and can be overloaded in C++.

Comparison operators/relational operators

All comparison operators can be overloaded in C++. Since C++20, the inequality operator is automatically generated if operator== is defined and all four relational operators are automatically generated if operator<=> is defined.

Logical operators

All logical operators exist in C and C++ and can be overloaded in C++, albeit the overloading of the logical AND and logical OR is discouraged, because as overloaded operators they behave as ordinary function calls, which means that both of their operands are evaluated, so they lose their well-used and expected short-circuit evaluation property.

Bitwise operators

All bitwise operators exist in C and C++ and can be overloaded in C++.

Assignment operators

All assignment expressions exist in C and C++ and can be overloaded in C++.

For the given operators the semantic of the built-in combined assignment expression a ⊚= b is equivalent to a = a ⊚ b, except that a is evaluated only once.

Member and pointer operators

Other operators

Notes:

Operator precedence
The following is a table that lists the precedence and associativity of all the operators in the C and C++ languages. Operators are listed top to bottom, in descending precedence. Descending precedence refers to the priority of the grouping of operators and operands. Considering an expression, an operator which is listed on some row will be grouped prior to any operator that is listed on a row further below it. Operators that are in the same cell (there may be several rows of operators listed in a cell) are grouped with the same precedence, in the given direction. An operator's precedence is unaffected by overloading.

The syntax of expressions in C and C++ is specified by a phrase structure grammar. The table given here has been inferred from the grammar. For the ISO C 1999 standard, section 6.5.6 note 71 states that the C grammar provided by the specification defines the precedence of the C operators, and also states that the operator precedence resulting from the grammar closely follows the specification's section ordering:

"The [C] syntax [i.e., grammar] specifies the precedence of operators in the evaluation of an expression, which is the same as the order of the major subclauses of this subclause, highest precedence first."

A precedence table, while mostly adequate, cannot resolve a few details. In particular, note that the ternary operator allows any arbitrary expression as its middle operand, despite being listed as having higher precedence than the assignment and comma operators. Thus a ? b, c : d is interpreted as a ? (b, c) : d, and not as the meaningless (a ? b), (c : d). So, the expression in the middle of the conditional operator (between ? and :) is parsed as if parenthesized. Also, note that the immediate, unparenthesized result of a C cast expression cannot be the operand of sizeof. Therefore, sizeof (int) * x is interpreted as (sizeof(int)) * x and not sizeof ((int) * x).

Notes
The precedence table determines the order of binding in chained expressions, when it is not expressly specified by parentheses.
 For example, ++x*3 is ambiguous without some precedence rule(s). The precedence table tells us that:  is 'bound' more tightly to  than to , so that whatever  does (now or later—see below), it does it ONLY to  (and not to x*3); it is equivalent to (++x, x*3).
 Similarly, with 3*x++, where though the post-fix  is designed to act AFTER the entire expression is evaluated, the precedence table makes it clear that ONLY  gets incremented (and NOT 3*x). In fact, the expression (tmp=x++, 3*tmp) is evaluated with  being a temporary value. It is functionally equivalent to something like (tmp=3*x, ++x, tmp).

 Abstracting the issue of precedence or binding, consider the diagram above for the expression 3+2*y[i]++. The compiler's job is to resolve the diagram into an expression, one in which several unary operators (call them 3+( . ), 2*( . ), ( . )++ and ( . )[ i ]) are competing to bind to y. The order of precedence table resolves the final sub-expression they each act upon: ( . )[ i ] acts only on y, ( . )++ acts only on y[i], 2*( . ) acts only on y[i]++ and 3+( . ) acts 'only' on 2*((y[i])++). It is important to note that WHAT sub-expression gets acted on by each operator is clear from the precedence table but WHEN each operator acts is not resolved by the precedence table; in this example, the ( . )++ operator acts only on y[i] by the precedence rules but binding levels alone do not indicate the timing of the postfix ++ (the ( . )++ operator acts only after y[i] is evaluated in the expression).

Many of the operators containing multi-character sequences are given "names" built from the operator name of each character. For example, += and -= are often called plus equal(s) and minus equal(s), instead of the more verbose "assignment by addition" and "assignment by subtraction".
The binding of operators in C and C++ is specified (in the corresponding Standards) by a factored language grammar, rather than a precedence table. This creates some subtle conflicts. For example, in C, the syntax for a conditional expression is:
logical-OR-expression ? expression : conditional-expression
while in C++ it is:
logical-OR-expression ? expression : assignment-expression
Hence, the expression:
e = a < d ? a++ : a = d
is parsed differently in the two languages. In C, this expression is a syntax error, because the syntax for an assignment expression in C is:
unary-expression '=' assignment-expression
In C++, it is parsed as:
e = (a < d ? a++ : (a = d))
which is a valid expression.

If you want to use comma-as-operator within a single function argument, variable assignment, or other comma-separated list, you need to use parentheses, e.g.: int a = 1, b = 2, weirdVariable = (++a, b), d = 4;

Criticism of bitwise and equality operators precedence
The precedence of the bitwise logical operators has been criticized. Conceptually, & and | are arithmetic operators like * and +.

The expression  is syntactically parsed as  whereas the expression  is parsed as . This requires parentheses to be used more often than they otherwise would.

Historically, there was no syntactic distinction between the bitwise and logical operators. In BCPL, B and early C, the operators  didn't exist. Instead  had different meaning depending on whether they are used in a 'truth-value context' (i.e. when a Boolean value was expected, for example in  it behaved as a logical operator, but in  it behaved as a bitwise one). It was retained so as to keep backward compatibility with existing installations.

Moreover, in C++ (and later versions of C) equality operations, with the exception of the three-way comparison operator, yield bool type values which are conceptually a single bit (1 or 0) and as such do not properly belong in "bitwise" operations.

C++ operator synonyms 
C++ defines certain keywords to act as aliases for a number of operators:

These can be used exactly the same way as the punctuation symbols they replace, as they are not the same operator under a different name, but rather simple token replacements for the name (character string) of the respective operator. This means that the expressions  and  have identical meanings. It also means that, for example, the bitand keyword may be used to replace not only the bitwise-and operator but also the address-of operator, and it can even be used to specify reference types (e.g., ). The ISO C specification makes allowance for these keywords as preprocessor macros in the header file . For compatibility with C, C++ provides the header , the inclusion of which has no effect.

See also
Bitwise operations in C
Bit manipulation
Logical operator
Boolean algebra (logic)
Table of logic symbols
Digraphs and trigraphs in C and in C++

References

External links
 .
C Operator Precedence
 .

C (programming language)
C++
Articles with example C++ code
Operators (programming)
Comparison of individual programming languages
이것은 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는 클래스나 열거형을 나타낸다.

산술 연산자

비교 연산자/관계 연산자

논리 연산자 

연산자 && 와 || 그리고 , 는 오버로딩하지 말아야 한다. 논리 연산이 필요하다면 대신 operator bool () 을 쓰도록 하자.

비트 연산자

복합 할당 연산자

멤버와 포인터 연산자

기타 연산자

연산자 우선순위 
다음은 C와 C++ 언어에서 모든 연산자의 우선순위와 결합법칙을 나열하는 표이다. 연산자는 내림차순 우선순위에서, 위에서 아래로 나열된다. 우선순위 내림차순은 연산자와 피연산자를 묶는 행위의 우선순서를 나타낸다. 표현식을 고려해서, 어떤 행 위에 나열된 연산자는 그것의 더 아래쪽 행 위에 나열된 모든 연산자의 이전에 피연산자와 묶인다. 같은 셀에 있는 연산자는 주어진 결합법칙의 방향대로 피연산자와 묶인다. 연산자의 우선순위는 오버로딩에 의해 영향받지 않는다. 연산자의 피연산자들이 모두 평가된 후에 그 연산자로 결과값이 계산되는 순서로 평가된다.

C와 C++에서 표현식의 구문은 문맥 자유 문법에 의해 지정된다. 여기에 주어진 표는 문법으로부터 추론되었다. ISO C 1999년 표준에 대해, 항목 6.5.6 주 71은 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)가 아니다.

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

 예를 들어, ++x*3은 얼핏 보면 모호해 보이지만, 우선순위 표에 따르면 x는 *연산자보다 전위 ++연산자를 더 우선시하고, 따라서 ++x 연산을 수행한 후에 x*3 연산을 수행하게 된다.
 3*x++도 마찬가지로, 후위 ++연산자가 가장 나중에 실행될 것처럼 보이지만, 우선순위에 따라 x++ 연산을 먼저 수행하게 된다. 그러나 x++ 연산은 후위 연산자라서 변수의 값을 사용 후에 증가시키므로, 결국 출력값은 x*3으로 출력이 된 후에, x값이 증가한다.

 우선순위 또는 바인딩의 문제를 추상화한, 오른쪽 그림을 보자. 컴파일러의 직업은 여러 y에게 바인딩으로 경쟁하는 단항 연산자들중 하나인, 표현식으로 도표를 해결하는 것이다. 우선순위 표의 순서는 각 행동에 대한 최종 하위-표현식들로 해결된다: ( . )[ i ]은 오직 y에 대해 작동하고, ( . )++은 오직 y[i]에 대해 작동하고, 2*( . )은 오직 y[i]++에 대해 작동하고 3+( . )은 '오직' 2*((y[i])++)에 대해 작동한다. 어떤 하위 표현식이 우선순위 표에서 명확한 각 연산자에 의해서 작동되지만 각 연산자의 행위가 우선순위 표에 의해결되지 않을 때를 참고하는 것은 중요하다; 이 예제에서, ( . )++ 연산자는 오직 우선순위 규칙에 의해 y[i]에서 작동하지만 단독 바인딩 수준들은 후위 연산자 ++의 타이밍을 표시하지 않는다.

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

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

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

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

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

따라서 표현식:
e = a < d ? a++ : a = d
은 두 언어에서 다르게 분석되었다. C에서, 이 표현은 구문 오류이지만, 많은 컴파일러는 그것을 이와 같이 분석한다:

lvalue가 아닌 조건 표현식(a++일 수 있다)의 결과 때문에, 이것은 의미론적 오류이다. C++에서, 그것은 이와 같이 분석한다:

그리고 그것은 올바른 표현식이다.

비트 논리 연산자의 우선순위는 비판받고 있다. 개념적으로, &와 |은 +와 *같이 산술 연산자이다.

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

C++ 연산자 동의어 
C++는 연산자들의 숫자에 대한 별명으로서 작동하는 키워드를 정의한다:
and (&&), bitand (&), and_eq (&=), or (||), bitor (|), or_eq (|=), xor (^), xor_eq (^=), not (!), not_eq (!=), compl (~). 그것들은 그들이 각 연산자의 이름 (문자 열)에 대한 간단한 텍스트 별명을 제외한, 다른 이름 아래에서 연산자가 같지 않음으로 그들이 대체하는 상징으로서 같은 방법을 정확하게 사용될 수 있다. 예를 들어, bitand는 비트 연산자뿐만 아니라 address-of 연산자를 대체하는 데 사용될 수 있고, 그것이 심지어 참조 자료형들을 지정하는 데 사용될 수 있다.

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

참고 문헌 및 각주

주해

외부 링크 
 C++ 연산자
 C와 C++에서 전위 연산자 대 후위 연산자
 C 프로그래밍에서 연산자

C 프로그래밍 언어
C++
연산자 (프로그래밍)