Movatterモバイル変換


[0]ホーム

URL:


Jump to content
WikipediaThe Free Encyclopedia
Search

Operators in C and C++

From Wikipedia, the free encyclopedia

This is a list ofoperators in theC andC++programming languages.

All listed operators are in C++ and lacking indication otherwise, in C as well. Some tables include a "In C" column that indicates whether an operator is also in C. Note that C does not supportoperator overloading.

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

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

Many operators specified by a sequence of symbols are commonly referred to by a name that consists of the name of each symbol. 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".

Operators

[edit]

In the following tables, lower case letters such asa andb represent literal values, object/variable names, or l-values, as appropriate.R,S andT stand for a data type, andK for a class or enumeration type. Some operators have alternative spellings usingdigraphs and trigraphs oroperator synonyms.

Arithmetic

[edit]

C and C++ have the same arithmetic operators and all can be overloaded in C++.

OperationSyntaxC++ prototype
in class Koutside class
Additiona+ bRK::operator+(Sb);Roperator+(Ka,Sb);
Subtractiona- bRK::operator-(Sb);Roperator-(Ka,Sb);
Unary plus;integer promotion+aRK::operator+();Roperator+(Ka);
Unary minus;additive inverse-aRK::operator-();Roperator-(Ka);
Multiplicationa* bRK::operator*(Sb);Roperator*(Ka,Sb);
Divisiona/ bRK::operator/(Sb);Roperator/(Ka,Sb);
Modulo[a]a% bRK::operator%(Sb);Roperator%(Ka,Sb);
Prefixincrement++aR&K::operator++();R&operator++(K&a);
Postfix incrementa++RK::operator++(int);[b]Roperator++(K&a,int);[b]
Prefixdecrement--aR&K::operator--();R&operator--(K&a);
Postfix decrementa--RK::operator--(int);[b]Roperator--(K&a,int);[b]

Relational

[edit]

Allrelational (comparison) operators can be overloaded in C++. SinceC++20, the inequality operator is automatically generated ifoperator== is defined and all four relational operators are automatically generated ifoperator<=> is defined.[1]

OperationSyntaxIn CC++ prototype
in class Koutside class
Equal toa== bYesboolK::operator==(Sconst&b)const;booloperator==(Kconst&a,Sconst&b);
Not equal toa!= bYesboolK::operator!=(Sconst&b)const;booloperator!=(Kconst&a,Sconst&b);
Greater thana> bYesboolK::operator>(Sconst&b)const;booloperator>(Kconst&a,Sconst&b);
Less thana< bYesboolK::operator<(Sconst&b)const;booloperator<(Kconst&a,Sconst&b);
Greater than or equal toa>= bYesboolK::operator>=(Sconst&b)const;booloperator>=(Kconst&a,Sconst&b);
Less than or equal toa<= bYesboolK::operator<=(Sconst&b)const;booloperator<=(Kconst&a,Sconst&b);
Three-way comparison[c][d]a<=> bNoautoK::operator<=>(constS&b);autooperator<=>(constK&a,constS&b);

Logical

[edit]

C and C++ have the same logical operators and all can be overloaded in C++.

Note that overloading logicalAND andOR is discouraged, because as overloaded operators they always evaluate both operands instead of providing the normal semantics ofshort-circuit evaluation.[2]

OperationSyntaxC++ prototype
in class Koutside class
NOT!aboolK::operator!();booloperator!(Ka);
ANDa&& bboolK::operator&&(Sb);booloperator&&(Ka,Sb);
ORa|| bboolK::operator||(Sb);booloperator||(Ka,Sb);

Bitwise

[edit]

C and C++ have the same bitwise operators and all can be overloaded in C++.

OperationSyntaxC++ prototype
in class Koutside class
NOT~a
RK::operator~();Roperator~(Ka);
ANDa& bRK::operator&(Sb);Roperator&(Ka,Sb);
ORa| bRK::operator|(Sb);Roperator|(Ka,Sb);
XORa^ bRK::operator^(Sb);Roperator^(Ka,Sb);
Shift left[e]a<< bRK::operator<<(Sb);Roperator<<(Ka,Sb);
Shift right[e][f]a>> bRK::operator>>(Sb);Roperator>>(Ka,Sb);

Assignment

[edit]

C and C++ have the same assignment operators and all can be overloaded in C++.

For the combination operators,a ⊚= b (where represents an operation) is equivalent toa = a ⊚ b, except thata is evaluated only once.

OperationSyntaxC++ prototype
in class Koutside class
Assignmenta= bR&K::operator=(Sb);N/a
Addition combinationa+= bR&K::operator+=(Sb);R&operator+=(K&a,Sb);
Subtraction combinationa-= bR&K::operator-=(Sb);R&operator-=(K&a,Sb);
Multiplication combinationa*= bR&K::operator*=(Sb);R&operator*=(K&a,Sb);
Division combinationa/= bR&K::operator/=(Sb);R&operator/=(K&a,Sb);
Modulo combinationa%= bR&K::operator%=(Sb);R&operator%=(K&a,Sb);
Bitwise AND combinationa&= bR&K::operator&=(Sb);R&operator&=(K&a,Sb);
Bitwise OR combinationa|= bR&K::operator|=(Sb);R&operator|=(K&a,Sb);
Bitwise XOR combinationa^= bR&K::operator^=(Sb);R&operator^=(K&a,Sb);
Bitwise left shift combinationa<<= bR&K::operator<<=(Sb);R&operator<<=(K&a,Sb);
Bitwise right shift combination[g]a>>= bR&K::operator>>=(Sb);R&operator>>=(K&a,Sb);

Member and pointer

[edit]
OperationSyntaxCan overloadIn CC++ prototype
in class Koutside class
Subscripta[b]a<:b:>[4]YesYesR&K::operator[](Sb);
R&K::operator[](Sb,...);[h]
N/a
Indirection
(object pointed to bya)
*aYesYesR&K::operator*();R&operator*(Ka);
Address-of
(address ofa)
&aYes[i]YesR*K::operator&();R*operator&(Ka);
Structure dereference
(memberb of object pointed to bya)
a->bYesYesR*K::operator->();[j]
N/a
Structure reference
(memberb of objecta)
a.bNoYesN/a
Member selected bypointer-to-memberb of object pointed to bya[k]a->*bYesNoR&K::operator->*(Sb);R&operator->*(Ka,Sb);
Member of objecta selected bypointer-to-memberba.*bNoNoN/a

Other

[edit]
OperationSyntaxCan overloadIn CC++ prototype
in class Koutside class
Function calla(a1, a2)YesYesRK::operator()(Sa,Tb,...);N/a
Commaa, bYesYesRK::operator,(Sb);Roperator,(Ka,Sb);
Ternary conditionala? b: cNoYesN/a
Scope resolutiona::b[l]NoNoN/a
User-defined literals[m][n]"a"_bYesNoN/aRoperator""_b(Ta)
Sizeofsizeof a[o]
sizeof (R)
NoYesN/a
Size ofparameter pack[n]sizeof...(Args)NoNoN/a
Alignof[n]alignof(R)
or_Alignof(R)[p]
NoYesN/a
Typeof[q]typeof(a)
typeof(R)
typeof_unqual(a)
typeof_unqual(R)
N/aYesN/a
Decltype[n]decltype(a)
decltype(R)
NoNoN/a
Type identificationtypeid(a)
typeid(R)
NoNoN/a
Conversion
(C-style cast)
(R)aYesYesK::operatorR();[5]N/a
Conversion[r][6]R(a)
R{a}[n]
auto(a)[h]
auto{a}[h]
NoNoN/a
static_cast conversion[s]static_cast<R>(a)YesNoK::operatorR();
explicitK::operatorR();[n]
N/a
dynamic cast conversiondynamic_cast<R>(a)NoNoN/a
const_cast conversionconst_cast<R>(a)NoNoN/a
reinterpret_cast conversionreinterpret_cast<R>(a)NoNoN/a
Allocate memorynew R[t]YesNovoid*K::operatornew(size_tx);void*operatornew(size_tx);
Allocate arraynew R[n][u]YesNovoid*K::operatornew[](size_ta);void*operatornew[](size_ta);
Deallocate memorydelete aYesNovoidK::operatordelete(void*a);voidoperatordelete(void*a);
Deallocate arraydelete[] aYesNovoidK::operatordelete[](void*a);voidoperatordelete[](void*a);
Exception check[n]noexcept(a)NoNoN/a
Reflection[v]^^aNoNoN/a

Synonyms

[edit]

C++ defines keywords to act as aliases for a number of operators:[7]

KeywordOperator
and&&
and_eq&=
bitand&
bitor|
compl~
not!
not_eq!=
or||
or_eq|=
xor^
xor_eq^=

Each keyword is a different way to specify an operator and as such can be used instead of the corresponding symbolic variation. For example,(a > 0 and not flag) and(a > 0 && !flag) specify the same behavior. As another example, thebitand keyword may be used to replace not only thebitwise-and operator but also theaddress-of operator, and it can be used to specify reference types (e.g.,int bitand ref = n).

The ISO C specification makes allowance for these keywords as preprocessor macros in the header fileiso646.h. For compatibility with C, C++ also provides the headeriso646.h, the inclusion of which has no effect. Until C++20, it also provided the corresponding headerciso646 which had no effect as well.

Expression evaluation order

[edit]

During expression evaluation, the order in which sub-expressions are evaluated is determined byprecedence andassociativity. An operator with higher precedence is evaluated before a operator of lower precedence and the operands of an operator are evaluated based on associativity. The following table describes the precedence and associativity of the C and C++ operators. Operators are shown in groups of equal precedence with groups ordered in descending precedence from top to bottom (lower order is higher precedence).[8][9][10]

Operator precedence is not affected by overloading.

OrderOperatorDescriptionAssociativity
1

highest

::Scope resolution (C++ only)None
2++Postfix incrementLeft-to-right
--Postfix decrement
()Function call
[]Array subscripting
.Element selection by reference
->Element selection through pointer
typeid()Run-time type information (C++ only) (seetypeid)
const_castType cast (C++ only) (seeconst_cast)
dynamic_castType cast (C++ only) (seedynamic cast)
reinterpret_castType cast (C++ only) (seereinterpret_cast)
static_castType cast (C++ only) (seestatic_cast)
3++Prefix incrementRight-to-left
--Prefix decrement
+Unary plus
-Unary minus
!Logical NOT
~Bitwise NOT (ones' complement)
(type)Type cast
*Indirection (dereference)
&Address-of
sizeofSizeof
_AlignofAlignment requirement (since C11)
new,new[]Dynamic memory allocation (C++ only)
delete,delete[]Dynamic memory deallocation (C++ only)
4.*Pointer to member (C++ only)Left-to-right
->*Pointer to member (C++ only)
5*MultiplicationLeft-to-right
/Division
%Modulo (remainder)
6+AdditionLeft-to-right
-Subtraction
7<<Bitwise left shiftLeft-to-right
>>Bitwise right shift
8<=>Three-way comparison (Introduced inC++20 - C++ only)Left-to-right
9<Less thanLeft-to-right
<=Less than or equal to
>Greater than
>=Greater than or equal to
10==Equal toLeft-to-right
!=Not equal to
11&Bitwise ANDLeft-to-right
12^Bitwise XOR (exclusive or)Left-to-right
13|Bitwise OR (inclusive or)Left-to-right
14&&Logical ANDLeft-to-right
15||Logical ORLeft-to-right
16co_awaitCoroutine processing (C++ only)Right-to-left
co_yield
17?:Ternary conditional operatorRight-to-left
=Direct assignment
+=Assignment by sum
-=Assignment by difference
*=Assignment by product
/=Assignment by quotient
%=Assignment by remainder
<<=Assignment by bitwise left shift
>>=Assignment by bitwise right shift
&=Assignment by bitwise AND
^=Assignment by bitwise XOR
|=Assignment by bitwise OR
throwThrow operator (exceptions throwing, C++ only)
18

lowest

,CommaLeft-to-right

Details

[edit]

Although this table is adequate for describing most evaluation order, it does not describe a few details. Theternary operator allows any arbitrary expression as its middle operand, despite being listed as having higher precedence than the assignment and comma operators. Thusa ? b, c : d is interpreted asa ? (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, the immediate, un-parenthesized result of a C cast expression cannot be the operand ofsizeof. Therefore,sizeof (int) * x is interpreted as(sizeof(int)) * x and notsizeof ((int) * x).

Chained expressions

[edit]

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:x is 'bound' more tightly to++ than to*, so that whatever++ does (now or later—see below), it does it ONLY tox (and not tox*3); it is equivalent to (++x,x*3).
  • Similarly, with3*x++, where though the post-fix++ is designed to act AFTER the entire expression is evaluated, the precedence table makes it clear that ONLYx gets incremented (and NOT3*x). In fact, the expression (tmp=x++,3*tmp) is evaluated withtmp being a temporary value. It is functionally equivalent to something like (tmp=3*x,++x,tmp).
Precedence and bindings
  • 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).

Binding

[edit]

The binding of operators in C and C++ is specified 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.[11][12]

To use the comma operator in a function call argument expression, variable assignment, or a comma-separated list, use of parentheses is required.[13][14] For example,

inta=1,b=2,weirdVariable=(++a,b),d=4;

Criticism of bitwise and equality operators precedence

[edit]

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

The expressiona&b==7 is syntactically parsed asa&(b==7) whereas the expressiona+b==7 is parsed as(a+b)==7. This requires parentheses to be used more often than they otherwise would.

Historically, there was no syntactic distinction between the bitwise and logical operators. InBCPL,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 inif(a==b&c){...} it behaved as a logical operator, but inc=a&b it behaved as a bitwise one). It was retained so as to keepbackward compatibility with existing installations.[16]

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

Notes

[edit]
  1. ^The modulus operator only supports integer operands; for floating point, a function such asfmod can be used.
  2. ^abcdTheint is a dummy parameter to differentiate between prefix and postfix.
  3. ^AboutC++20 three-way comparison
  4. ^Possible return types:std::weak_ordering,std::strong_ordering andstd::partial_ordering to which they all are convertible to.
  5. ^abIn the context ofiostreams in C++, writers often will refer to<< and>> as the "put-to" or "stream insertion" and "get-from" or "stream extraction" operators, respectively.
  6. ^ According to the C99 standard, the right shift of a negative number is implementation defined. Most implementations, e.g., the GCC,[3] use anarithmetic shift (i.e., sign extension), but alogical shift is possible.
  7. ^ According to the C99 standard, the right shift of a negative number is implementation defined. Most implementations, e.g., the GCC,[3] use anarithmetic shift (i.e., sign extension), but alogical shift is possible.
  8. ^abcsince C++23
  9. ^The actual address of an object with an overloadedoperator & can be obtained withstd::addressof
  10. ^The return type ofoperator->() must be a type for which the-> operation can be applied, such as a pointer type. Ifx is of typeC whereC overloadsoperator->(),x->y gets expanded tox.operator->()->y.
  11. ^Meyers, Scott (October 1999),"Implementing operator->* for Smart Pointers"(PDF),Dr. Dobb's Journal, Aristeia.
  12. ^Although a:: punctuator exists in C as of C23, it is not used as a scope resolution operator.
  13. ^AboutC++11 User-defined literals
  14. ^abcdefgsince C++11
  15. ^The parentheses are not necessary when taking the size of a value, only when taking the size of a type. However, they are usually used regardless.[citation needed]
  16. ^C++ definesalignof operator, whereas C defines_Alignof (C23 defines both). Both operators have the same semantics.
  17. ^since C23; not in standard C++
  18. ^Behaves like const_cast/static_cast/reinterpret_cast. In the last two cases, theauto specifier is replaced with the type of the invented variable x declared withauto x(a); (which is never interpreted as a function declaration) orauto x{a};, respectively.
  19. ^For user-defined conversions, the return type implicitly and necessarily matches the operator name unless the type is inferred (e.g.operatorauto(),operatordecltype(auto)() etc.).
  20. ^The type name can also be inferred (e.gnew auto) if an initializer is provided.
  21. ^The array size can also be inferred if an initializer is provided.
  22. ^since C++26

See also

[edit]
  • Bitwise operations in C – Operations transforming individual bits of integral data types
  • Bit manipulation – Algorithmically modifying data below the word level
  • Logical operator – Symbol connecting formulas in logicPages displaying short descriptions of redirect targets
  • Boolean algebra (logic) – Algebraic manipulation of "true" and "false"Pages displaying short descriptions of redirect targets
  • Table of logic symbols – List of symbols used to express logical relationsPages displaying short descriptions of redirect targets

References

[edit]
  1. ^"Operator overloading§Comparison operators".cppreference.com.
  2. ^"Standard C++".
  3. ^ab"Integers implementation",GCC 4.3.3, GNU.
  4. ^"ISO/IEC 9899:1999 specification, TC3"(PDF). p. 64, § 6.4.6Ponctuators para. 3.
  5. ^"user-defined conversion". Retrieved5 April 2020.
  6. ^Explicit type conversion in C++
  7. ^ISO/IEC 14882:1998(E) Programming Language C++. open-std.org – The C++ Standards Committee. 1 September 1998. pp. 40–41.
  8. ^ISO/IEC 9899:201x Programming Languages - C. open-std.org – The C Standards Committee. 19 December 2011. p. 465.
  9. ^the ISO C 1999 standard, section 6.5.6 note 71 (Technical report). ISO. 1999.
  10. ^"C++ Built-in Operators, Precedence and Associativity".docs.microsoft.com. Retrieved11 May 2020.
  11. ^"C Operator Precedence - cppreference.com".en.cppreference.com. Retrieved10 April 2020.
  12. ^"Does the C/C++ ternary operator actually have the same precedence as assignment operators?".Stack Overflow. Retrieved22 September 2019.
  13. ^"Other operators - cppreference.com".en.cppreference.com. Retrieved10 April 2020.
  14. ^"c++ - How does the Comma Operator work".Stack Overflow. Retrieved1 April 2020.
  15. ^C history § Neonatal C, Bell labs.
  16. ^"Re^10: next unless condition".www.perlmonks.org. Retrieved23 March 2018.

External links

[edit]
Features
Standard library
Implementations
Compilers
IDEs
Comparison with
other languages
Descendant
languages
Designer
Features
Standard Library
Ideas
Compilers
IDEs
Superset languages
Dialects
Relative to
other languages
People
Retrieved from "https://en.wikipedia.org/w/index.php?title=Operators_in_C_and_C%2B%2B&oldid=1337146407"
Categories:
Hidden categories:

[8]ページ先頭

©2009-2026 Movatter.jp