c++ 运算符优先级
来源:互联网 发布:数据字典怎么画 编辑:程序博客网 时间:2024/05/21 18:45
原文地址:http://en.cppreference.com/w/cpp/language/operator_precedence
C++ Operator Precedence
The following table lists the precedence and associativity of C++ operators. Operators are listed top to bottom, in descending precedence.
::
Scope resolutionLeft-to-right++
--
Suffix/postfix increment and decrementtype()
type{}
Functional cast()
Function call[]
Subscript.
->
Member access++
--
Prefix increment and decrementRight-to-left+
-
Unary plus and minus!
~
Logical NOT and bitwise NOT(type)
C-style cast*
Indirection (dereference)&
Address-ofsizeof
Size-of[note 1]new
new[]
Dynamic memory allocationdelete
delete[]
Dynamic memory deallocation.*
->*
Pointer-to-memberLeft-to-right*
/
%
Multiplication, division, and remainder+
-
Addition and subtraction<<
>>
Bitwise left shift and right shift<
<=
For relational operators < and ≤ respectively>
>=
For relational operators > and ≥ respectively==
!=
For relational operators = and ≠ respectively&
Bitwise AND^
Bitwise XOR (exclusive or)|
Bitwise OR (inclusive or)&&
Logical AND||
Logical OR?:
Ternary conditional[note 2]Right-to-leftthrow
throw operator=
Direct assignment (provided by default for C++ classes)+=
-=
Compound assignment by sum and difference*=
/=
%=
Compound assignment by product, quotient, and remainder<<=
>>=
Compound assignment by bitwise left shift and right shift&=
^=
|=
Compound assignment by bitwise AND, XOR, and OR,
CommaLeft-to-right- ↑ The operand of
sizeof
can't be a C-style type cast: the expressionsizeof (int) * p
is unambiguously interpreted as(sizeof(int)) * p
, but notsizeof((int)*p)
. - ↑ The expression in the middle of the conditional operator (between
?
and:
) is parsed as if parenthesized: its precedence relative to?:
is ignored.
When parsing an expression, an operator which is listed on some row of the table above with a precedence will be bound tighter (as if by parentheses) to its arguments than any operator that is listed on a row further below it with a lower precedence. For example, the expressions std::cout << a & b and *p++ are parsed as (std::cout << a) & b and *(p++), and not as std::cout << (a & b) or (*p)++.
Operators that have the same precedence are bound to their arguments in the direction of their associativity. For example, the expression a = b = c is parsed as a = (b = c), and not as (a = b) = c because of right-to-left associativity of assignment, but a + b - c is parsed (a + b) - c and not a + (b - c) because of left-to-right associativity of addition and subtraction.
Associativity specification is redundant for unary operators and is only shown for completeness: unary prefix operators always associate right-to-left (delete ++*p is delete(++(*p))) and unary postfix operators always associate left-to-right (a[1][2]++ is ((a[1])[2])++). Note that the associativity is meaningful for member access operators, even though they are grouped with unary postfix operators: a.b++ is parsed (a.b)++ and not a.(b++))
Operator precedence is unaffected by operator overloading.
Notes
Precedence and associativity are compile-time concepts and are independent from order of evaluation, which is a runtime concept.
The standard itself doesn't specify precedence levels. They are derived from the grammar.
const_cast, static_cast, dynamic_cast, reinterpret_cast, typeid, sizeof..., noexcept and alignof are not included since they are never ambiguous.
Some of the operators have alternate spellings (e.g., and for &&
, or for ||
, not for !
, etc.).
Relative precedence of the ternary conditional and assignment operators differs between C and C++: in C, assignment is not allowed on the right-hand side of a ternary conditional operator, so e = a < d ? a++ : a = dcannot be parsed. Many C compilers use a modified grammar where ?:
has higher precedence than =
, which parses that as e = ( ((a < d) ? (a++) : a) = d ) (which then fails to compile because ?:
is never lvalue in C and =
requires lvalue on the left). In C++, ?:
and =
have equal precedence and group right-to-left, so that e = a < d ? a++ : a = d parses as e = ((a < d) ? (a++) : (a = d)).
See also
decrementarithmeticlogicalcomparisonmember
accessother
a = b
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
? :
static_cast converts one type to another related type
dynamic_cast converts within inheritance hierarchies
const_cast adds or removes cv qualifiers
reinterpret_cast converts type to unrelated type
C-style cast converts one type to another by a mix of static_cast
, const_cast
, and reinterpret_cast
new allocates memory
delete deallocates memory
sizeof queries the size of a type
sizeof... queries the size of a parameter 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)
- c 运算符 优先级
- c 运算符 优先级
- C运算符优先级
- c运算符优先级
- C运算符优先级
- C运算符优先级
- C运算符优先级
- c运算符优先级
- c运算符优先级
- C运算符优先级
- C运算符优先级
- C运算符优先级
- C运算符优先级
- c运算符优先级
- C 运算符优先级
- C运算符优先级
- c 运算符 优先级
- C运算符优先级
- 技术负责人在创业进阶中如何蜕变?
- nodejs模块xml2js解析xml的坑
- 正则表达式在iOS中的运用
- 文本压缩1
- 【Android应用开发技术:网络通信】Android HTTP编程
- c++ 运算符优先级
- redhat系列软件包管理
- JMeter性能测试基础 (2) - 变量的使用
- WIN7下怎么建立VPN服务器
- 将Vim配置成为一款强大的编辑工具之 自动补全
- Android四大组件之Broadcast Receiver
- MongoDB学习十四 --MongoDB的分片
- java多态中的一些问题分析
- 一些软件设计的原则