返回介绍

附录 D 运算符优先级

发布于 2024-10-08 23:14:16 字数 5971 浏览 0 评论 0 收藏 0

运算符优先级决定了运算符用于值的顺序。C++运算符分为 18 个优先级组,如表 D.1 所示。第 1 组中的运算符的优先级最高,第 2 组中运算符的优先级次之,依此类推。如果两个运算符被用于同一个操作数,则首先应用优先级高的运算符。如果两个运算符的优先级相同,则 C++使用结合性规则来决定哪个运算符结合得更为紧密。同一组中运算符的优先级和结合性相同,不管是从左到右(表中 L-R)还是从右到左(表中 R-L)结合。从左到右的结合性意味着首先应用最左边的运算符,而从右到左的结合性则意味着首先应用最右边的运算符。

表 D.1 C++运算符的优先级和结合性

运 算 符结 合 性含 义
优先级第 1 组
:: 作用域解析运算符
优先级第 2 组
(表达式) 分组
()L-R函数调用
() 值构造,即 type(expr)
[ ] 数组下标
-> 间接成员运算符
. 直接成员运算符
const_cast 专用的类型转换
dynamic_cast 专用的类型转换
reinterpret_cast 专用的类型转换
static_cast 专用的类型转换
typeid 类型标识
++ 加 1 运算符,后缀
- - 减 1 运算符,后缀
优先级第 3 组(全是一元运算符)
!R-L逻辑非
~ 位非
+ 一元加号(正号)
- 一元减号(负号)
++ 加 1 运算符,前缀
- - 减 1 运算符,前缀
& 地址
* 解除引用(间接值)
() 类型转换,即(type)expr
sizeof 长度,以字节为单位
new 动态分配内存
new [ ] 动态分配数组
delete 动态释放内存
delete [ ] 动态释放数组
优先级第 4 组
. *L-R成员解除引用
->* 间接成员解除引用
优先级第 5 组(全是二元运算符)
*L-R
/ 
^ 模(余数)
优先级第 6 组(全是二元运算符)
+L-R
- 
优先级第 7 组
<<L-R左移
>> 右移
优先级第 8 组
<L-R小于
<= 小于或等于
>= 大于或等于
> 大于
优先级第 9 组
= =L-R等于
!= 不等于
优先级第 10 组(一元运算符)
&L-R按位 AND
优先级第 11 组
^L-R按位 XOF(异或)
优先级第 12 组
|L-R按位 OR
优先级第 13 组
&&L-R逻辑 AND
优先级第 14 组
| |L-R逻辑 OR
优先级第 15 组
:?R-L条件
优先级第 16 组
=R-L简单赋值
* = 乘并赋值
/= 除并赋值
%= 求模并赋值
+= 加并赋值
-= 减并赋值
&= 按位 AND 并赋值
^= 按位 XOR 并赋值
|= 按位 OR 并赋值
<<= 左移并赋值
>>= 右移并赋值
优先级第 17 组
throwL-R引发异常
优先级第 18 组
,L-R将两个表达式合并成一个

有些符号(如*或&)被用作多个运算符。在这种情况下,一种形式是一元(一个操作数),另一种形式是二元(两个操作数),编译器将根据上下文来确定使用哪种形式。对于同一个符号可以两种方式使用的情况,表 D.1 将运算符标记为一元组或二元组。

下面介绍一些优先级和结合性的例子。

对于下面的例子,编译器必须决定先将 5 和 3 相加,还是先将 5 和 6 相乘:

*运算符的优先级比+运算符高,所以它被首先用于 5,因此表达式变成 3 +30,即 33。

对于下面的例子,编译器必须决定先将 120 除以 6,还是先将 6 和 5 相乘:

/和的优先级相同,但这些运算符从左到右结合的。这意味着首先应用操作数(6)左侧的运算符,因此表达式变为 205,即 100。

对于下面的例子,编译器必须决定先对 str 递增还是先对 str 解除引用:

后缀++运算符的优先级比一元运算符高,这意味着加号运算符将对 str 进行操作,而不是对str 进行操作。也就是说,将指针加 1,使之指向下一个字符,而不是修改被指针指向的字符。不过,由于++是后缀形式,因此将在将*str 的值赋给 ch 后,再将指针加 1。因此,上述表达式将字符 W 赋给 ch,然后移动指针 str,使之指向字符 h。

下面是一个类似的例子:

前缀++运算符和一元运算符的优先级相同,但它们是从右到左结合的。因此,str(不是str)将被加 1。因为++运算符是前缀形式,所以首先将 str 加 1,然后将得到的指针执行解除引用的操作。因此,str 将指向字符 h,并将字符 h 赋给 ch。

注意,表 D.1 在“优先级”行中使用一元或二元来区分使用同一个符号的两个运算符,如一元地址运算符和二元按位 AND 运算符。

附录 B 列出了一些运算符的替代表示。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文