博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ 运算符优先级
阅读量:2443 次
发布时间:2019-05-10

本文共 3283 字,大约阅读时间需要 10 分钟。

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

Precedence Operator Description Associativity
1 :: Left-to-right
2 ++   -- Suffix/postfix 
type()   type{}
()
[]
.   ->
3 ++   -- Prefix  Right-to-left
+   - Unary 
!   ~  and 
(type)
*  (dereference)
&
sizeof
new   new[]
delete   delete[]
4 .*   ->* Left-to-right
5 *   /   %
6 +   -
7 <<   >> Bitwise 
8 <   <= For  < and ≤ respectively
>   >= For  > and ≥ respectively
9 ==   != For  = and ≠ respectively
10 &
11 ^  (exclusive or)
12 |  (inclusive or)
13 &&
14 ||
15 ?: Right-to-left
throw
=  (provided by default for C++ classes)
+=   -=  by sum and difference
*=   /=   %=  by product, quotient, and remainder
<<=   >>=  by bitwise left shift and right shift
&=   ^=   |=  by bitwise AND, XOR, and OR
16 , Left-to-right
  1.  The operand of sizeof can't be a C-style type cast: the expression sizeof (int) * p is unambiguously interpreted as(sizeof(int)) * p, but not sizeof((int)*p).
  2.  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  << a & b and *p++ are parsed as ( << a) & b and *(p++), and not as  << (& b) or (*p)++.

Operators that have the same precedence are bound to their arguments in the direction of their associativity. For example, the expression = b = c is parsed as = (= c), and not as (= b) = c because of right-to-left associativity of assignment, but + b - c is parsed (+ b) - c and not + (- 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 .

Notes

Precedence and associativity are compile-time concepts and are independent from , which is a runtime concept.

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

, , , , , ,  and  are not included since they are never ambiguous.

Some of the operators have  (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 = a < d ? a++ : a = dcannot be parsed. Many C compilers use a modified grammar where ?: has higher precedence than =, which parses that as = ( ((< 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 = a < d ? a++ : a = d parses as = ((< d) ? (a++) : (= d)).

转载地址:http://ptiqb.baihongyu.com/

你可能感兴趣的文章
FREEBSD 升级及优化全攻略(转)
查看>>
系统移民须知:Linux操作系统安装要点(转)
查看>>
在redhat系统中使用LVM(转)
查看>>
Gentoo 2005.1 完整的USE参数清单中文详解(转)
查看>>
如何在嵌入式Linux产品中做立体、覆盖产品生命期的调试 (5)
查看>>
手机最新触控技术
查看>>
Kubuntu 项目遭遇困难(转)
查看>>
kubuntu使用日记之 eva的配置使用(转)
查看>>
unix下几个有用的小shell脚本(转)
查看>>
QQ病毒的系列处理办法(转)
查看>>
Red Hat并购JBoss 谁将受创?(转)
查看>>
基于IBM大型主机,Linux开辟意大利旅游新天地(转)
查看>>
一些Linux试题(经典!!)(转)
查看>>
优化MySQL数据库性能的八大“妙手”(转)
查看>>
福布斯:Sun下场本可避免 老CEO不听劝(转)
查看>>
根据什么选择一套适合自己的linux系统?(转)
查看>>
戴尔将在法国推出Linux笔记本(转)
查看>>
近9成盗版Office用户称愿投奔开源(转)
查看>>
MySQL购InnoDB不敌甲骨文宣布开放数据引擎(转)
查看>>
银行监会选红旗Linux建设公文传输系统(转)
查看>>