运算符优先级
2016-03-13 19:14
246 查看
运算符优先级
运算符优先级决定了运算符用于值的顺序。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 | 将两个表达式合并成一个 |
下面介绍一些优先级和结合性的例子。
对于下面的例子,编译器必须决定先将5和3相加,还是先将5和6相乘:
3+5*6
*运算符的优先级比+运算符高,所以它被首先用于5,因此表达式变成3 +30,即33。
对于下面的例子,编译器必须决定先将120除以6,还是先将6和5相乘:
Char* str ="whoa";
char ch=*str++;
/和*的优先级相同,但这些运算符从左到右结合的。这意味着首先应用操作数(6)左侧的运算符,因此表达式变为20*5,即100。
对于下面的例子,编译器必须决定先对str递增还是先对str解除引用:
后缀++运算符的优先级比一元运算符*高,这意味着加号运算符将对str进行操作,而不是对*str进行操作。也就是说,将指针加1,使之指向下一个字符,而不是修改被指针指向的字符。不过,由于++是后缀形式,因此将在将*str的值赋给ch后,再将指针加1。因此,上述表达式将字符W赋给ch,然后移动指针str,使之指向字符h。
下面是一个类似的例子:
Char* str ="whoa";
char ch=*++str;
前缀++运算符和一元运算符*的优先级相同,但它们是从右到左结合的。因此,str(不是*str)将被加1。因为++运算符是前缀形式,所以首先将str加1,然后将得到的指针执行解除引用的操作。因此,str将指向字符h,并将字符h赋给ch。
注意,表D.1在“优先级”行中使用一元或二元来区分使用同一个符号的两个运算符,如一元地址运算符和二元按位AND运算符。
相关文章推荐
- iOS 页面传值方式 单例,block,代理协议方法,通知中心
- ORACLE体系结构
- Hibernate的原理体系架构,五大核心接口,Hibernate对象的三种状态转换,事务管理
- 20145208《Java程序设计》第2周学习总结
- 在Ubuntu14.04上搭建Bugzilla
- SVN更新错误:类加载失败,无法读取项目文件"web.csproj"
- [概率论 DP] BZOJ 3652 大新闻
- hdu5644 King's Pilots 【费用流】
- Faster RCNN 运行自己的数据,刚开始正常,后来就报错: Index exceeds matrix dimensions. Error in ori_demo (line 114) boxes_cell{i} = [boxes(:, (1+(i-1)*4):(i*4)), scores(:, i)];
- Java并发包中CountDownLatch的工作原理、使用示例
- Linux内核分析— —构造一个简单的Linux系统MenuOS(20135213林涵锦)
- 作业二
- [转]开发Visual Studio风格的用户界面--MagicLibrary使用指南
- (八)黑马程序员——反射
- C++ const型成员函数与 non-const型成员函数 (二)
- [Splay] NOI2005 维修数列
- 机房重构——报表
- angularJS 常用插件指令
- Linux内核分析第三周学习笔记
- [BZOJ1874][BeiJing2009 WinterCamp]取石子游戏(博弈SG函数)