C++ Operator Precedence c++运算符优先级列表
来源:互联网 发布:软件类上市公司 编辑:程序博客网 时间:2024/05/22 04:42
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-righta++
a--
Suffix/postfix increment and decrementtype()
type{}
Functional casta()
Function calla[]
Subscript.
->
Member access++a
--a
Prefix increment and decrementRight-to-left+a
-a
Unary plus and minus!
~
Logical NOT and bitwise NOT(type)
C-style cast*a
Indirection (dereference)&a
Address-ofsizeof
Size-of[note 1]new
new[]
Dynamic memory allocationdelete
delete[]
Dynamic memory deallocation.*
->*
Pointer-to-memberLeft-to-righta*b
a/b
a%b
Multiplication, division, and remaindera+b
a-b
Addition and subtraction<<
>>
Bitwise left shift and right shift<
<=
For relational operators < and ≤ respectively>
>=
For relational operators > and ≥ respectively==
!=
For relational operators = and ≠ respectivelya&b
Bitwise AND^
Bitwise XOR (exclusive or)|
Bitwise OR (inclusive or)&&
Logical AND||
Logical ORa?b:c
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. For example, std::cout << a ? b : c; parses as (std::cout << a) ? b : c; because the precedence of arithmetic left shift is higher than the conditional operator.
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 = d cannot 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 creates objects with dynamic storage duration
delete destructs objects previously created by the new expression and releases obtained memory area
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 Operator Precedence Table
- C++ 运算符优先级列表 --C++ Operator Precedence
- C++运算符优先级列表 C++ Operator Precedence
- C++ Operator Precedence c++运算符优先级列表
- C++ Operator Precedence 运算符优先级
- C + + operator precedence list
- [C++]C++ Operator Precedence
- C++中的运算符优先级 - C++ Operator Precedence
- C++:运算符优先级列表
- C运算符优先级列表
- c运算符优先级列表
- c++ operator precedence/操作符优先级
- C/C++运算符优先级列表
- C语言运算符优先级列表
- C语言运算符优先级 详细列表
- C语言运算符优先级 详细列表
- C语言运算符优先级 详细列表
- C语言运算符优先级 详细列表
- JDBC连接数据库基础
- ASP.NET Config读写示例
- if-else 分支预测
- abstract类及其方法
- SolidWorks 部分插件不显示
- C++ Operator Precedence c++运算符优先级列表
- jquery实现的返回顶部+侧边栏功能
- mysql重连,连接丢失
- form下载文件,指向iframe ,如何判断iframe加载完成 form.submit之后的事件问题 监听form表单下载文件是否完成
- Android数据加密之Base64编码算法
- js中replace全部替换的正则表达式
- Android多媒体访问
- caffe相关特殊层解释
- MySQL数据库设计——以学生成绩数据库为例