- 内容提要
- 前言
- 第 1 章 预备知识
- 第 2 章 开始学习 C++
- 第 3 章 处理数据
- 第 4 章 复合类型
- 第 5 章 循环和关系表达式
- 第 6 章 分支语句和逻辑运算符
- 第 7 章 函数——C++的编程模块
- 第 8 章 函数探幽
- 第 9 章 内存模型和名称空间
- 第 10 章 对象和类
- 第 11 章 使用类
- 第 12 章 类和动态内存分配
- 第 13 章 类继承
- 第 14 章 C++中的代码重用
- 第 15 章 友元、异常和其他
- 第 16 章 string 类和标准模板库
- 第 17 章 输入、输出和文件
- 第 18 章 探讨 C++新标准
- 附录 A 计数系统
- 附录 B C++保留字
- 附录 C ASCII 字符集
- 附录 D 运算符优先级
- 附录 E 其他运算符
- 附录 F 模板类 string
- 附录 G 标准模板库方法和函数
- 附录 H 精选读物和网上资源
- 附录 I 转换为 ISO 标准 C++
- 附录 J 复习题答案
附录 D 运算符优先级
运算符优先级决定了运算符用于值的顺序。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 组 | ||
throw | L-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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论