rc : C++ Operator Precedence

来源:互联网 发布:大学生软件开发项目 编辑:程序博客网 时间:2024/05/22 16:01
original url from:

http://www.cppblog.com/aqazero/archive/2012/04/11/8284.html
http://en.cppreference.com/w/cpp/language/operator_precedence

Actions

C++ Operator Precedence

From cppreference.com


The following table lists the precedence and associativity of C++ operators. Operators are listed top to bottom,

in descending precedence.

PrecedenceOperatorDescriptionAssociativity1::Scope resolutionLeft-to-right2++ --Suffix/postfix increment and decrement()Function call[]

Array subscripting

.Element selection by reference−>Element selection through pointer3++ --Prefix increment and decrementRight-to-left+ Unary plus and minus! ~Logical NOT and bitwise NOT(type)Type cast*Indirection (dereference)&Address-ofsizeofSize-ofnew, new[]Dynamic memory allocationdelete, delete[]Dynamic memory deallocation4.* ->*Pointer to memberLeft-to-right5* / %Multiplication, division, and remainder6+ Addition and subtraction7<< >>Bitwise left shift and right shift8< <=For relational operators < and ≤ respectively> >=For relational operators > and ≥ respectively9== !=For relational = and ≠ respectively10&Bitwise AND11^Bitwise XOR (exclusive or)12|Bitwise OR (inclusive or)13&&Logical AND14||Logical OR15?:Ternary conditionalRight-to-Left16=Direct assignment (provided by default for C++ classes)+= −=Assignment by sum and difference*= /= %=Assignment by product, quotient, and remainder<<= >>=Assignment by bitwise left shift and right shift&= ^= |=Assignment by bitwise AND, XOR, and OR17throwThrow operator (for exceptions)18,CommaLeft-to-right

When parsing an expression, an operator which is listed on some row will be bound tighter (as if by

parentheses) to its arguments than any operator that is listed on a row further below it. For example,

the expressionsstd::cout<<a&b and*p++ are parsed as(std::cout<<a)&b and *(p++),

and not asstd::cout<<(a&b) or (*p)++.

Operators that are in the same cell (there may be several rows of operators listed in a cell)

are evaluated with the same precedence, in the given direction.

For example, the expressiona=b=c is parsed asa=(b=c), and not as(a=b)=c

because of right-to-left associativity.

An operator's precedence is unaffected by overloading.

[edit]Notes

The standard itself doesn't specify precedence levels. They are derived from the grammar.

const_cast,static_cast,dynamic_cast,reinterpret_cast and typeid

are not included since they are never ambiguous.

Some of the operators have alternate spellings (e.g., and for&&,or for||,not for!, etc.).

[edit]See also

Order of evaluation of operator arguments at run time.

Common operatorsassignmentincrement
decrementarithmeticlogicalcomparisonmember
accessother

a = b
a = rvalue
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->*b
a.*b

a(...)
a, b
(type) a
? :

Special operators

static_cast converts one type to another compatible type
dynamic_cast converts virtual base class to derived class
const_cast converts type to compatible type with differentcv qualifiers
reinterpret_cast converts type to incompatible type
new allocates memory
delete deallocates memory
sizeof queries the size of a type
sizeof... queries the size of aparameter pack (since C++11)
typeid queries the type information of a type
noexcept checks if an expression can throw an exception(since C++11)
alignof queries alignment requirements of a type(since C++11)

Retrieved from
"http://en.cppreference.com/mwiki/index.php?title=cpp/language/operator_precedence&oldid=37397"
原创粉丝点击