优先级"/>
C/C++运算优先级
文章目录
- 前言
- 1.运算优先级表
- 2.举例说明:
- 总结
前言
最近复习C++基础知识的时候,发现对这部分还是有些模糊。常用的+ - × ÷
,括号等运算符对于它们的优先级还是比较明确的。但是涉及到移位运算,逻辑运算这种,再结合四则运算,就有点分不清了。
为此这篇博客就记录一下,后面再稍微结合点例子举例说明一下。
1.运算优先级表
优先级 | 运算符 | 功能 | 目数 | 结合性 |
1 | ( ) | 改变运算优先级或函数调用 | 双目 | 从左向右 |
[ ] | 访问数组元素 | |||
. | 直接访问数据成员 | |||
-> | 间接访问数据成员 | |||
2 | ! | 逻辑非 | 单目 | 从右到左 |
~ | 按位取反 | |||
+,- | 取正,取负 | |||
* | 间接访问对象 | |||
& | 取对象地址 | |||
++,- - | 增1,减1 | |||
( ) | 强制类型转换 | |||
sizeof | 测类型长度 | |||
3 | *,/,% | 乘除取余 | 双目 | 从左到右 |
4 | +,- | 加减 | ||
5 | <<,>>,>>> | 按位左移,按位右移,无符号右移 | ||
6 | <,<=,>,>= | 小于,小于等于,大于,大于等于 | ||
7 | ==,!= | 等于,不等于 | ||
8 | & | 按位与 | ||
9 | ^ | 按位异或 | ||
10 | | | 按位或 | ||
11 | && | 逻辑与 | ||
12 | || | 逻辑或 | ||
13 | ?: | 条件运算符 | 三目 | 从右向左 |
14 | = | 赋值 | 双目 | 从右向左 |
+=,-= | 加赋值,减赋值 | |||
*=,/= | 乘赋值,除赋值 | |||
%=,&= | 取余赋值,按位与赋值 | |||
^= | 按位异或赋值 | |||
|= | 按位或赋值 | |||
<<= | 按位左移赋值 | |||
>>= | 按位右移赋值 | |||
15 | , | 逗号运算符 | 双目 | 从左向右 |
2.举例说明:
Example1
求值:5+10*20/2
这个就是简单的四则运算,先乘除再加减。
对应一下上面的表就是,乘除的优先级3比加减的优先级4要高,所以先乘除,同时满足从左到右,因此先是乘,10乘以20,再是除,200除以2,最后在加5,得到的答案为105
Example2
求值:12 / 3 * 4 + 5 * 15 + 24 % 4 / 2
这个和上面类似,只不过多了一个取余%,结合上表,优先级3,4两行。
所要求的式子等价于((12 / 3) * 4) + (5 * 15) + ((24 % 4) / 2)
=9
Example3
假设i、j和k是三个整数,说明表达式i!=j<k的含义。
这题就是比较!=
和<
之间优先级的比较。
查一下表可以看到!=
优先级为7,<
为6,所以应该先算小于,再判断不等号。
因此上式的求值过程等同于i !=(j<k),先比较j和k的大小,得到的结果是一个布尔值(1或0);然后判断i的值与之是否相等。
Example4
因为运算符的优先级问题,下面这条表达式无法通过编译。根据上表指出它的问题在哪里?应该如何修改?
string s = “word” ;
string pl = s + s[s.size ( ) - 1] == ‘s’? “” : “s” ;
看这个第二句赋值语句,我们是想判断字符串s的最后一个字符是否是s,如果是的话就不变,否则就让s字符串的最后一个字符为s。
但是这里因为运算符优先级问题,无法实现我们想要的效果。
题目中的几个运算符的优先级次序从高到低是加法运算符、相等运算符、条件运算符和赋值运算符,因此式子的求值过程是先把s和 s [s.size ( ) - 1]相加得到一个新字符串,然后该字符串与字符’s’比较是否相等,这是一个非法操作,并且与程序的原意不符。
要想实现程序的原意,即先判断字符串s 的最后一个字符是否是’s’,如果是,什么也不做;如果不是,在 s 的末尾添加一个字符’s’,我们应该添加括号强制限定运算符的执行顺序。
string pl = s + (s [s.size() - 1] == 's'? "" : "s") ;
Example5
如果一台机器上int占32位.char占8位,用的是 Latin-1字符集,其中字符’q’的二进制形式是01110001,那么表达式~ ‘q’<<6的值是什么?
在位运算符中,运算符~(优先级2)的优先级高于<<(优先级5),因此先对q按位求反,因为位运算符的运算对象应该是整数类型,所以字符’q’首先转换为整数类型。如题所示,char占8位而int占32位,所以字符’q’转换后得到
00000000 0000000 00000000 01110001,按位求反得到11111111 11111111 11111111 10001110;接着执行移位操作,得到11111111 11111111 11100011 10000000。
C++规定整数按照其补码形式存储,对上式求补,得到10000000 000000000011100 10000000,即最终结果的二进制形式,转换成十进制形式是-7296
。
Example6
说明下面这条表达式的含义。
somevalue ?++x,++y : - -x,- -y
这个咋一看,somevalue为真,那就++x,++y,否则就- -x,- -y。
我们自己看一下上面的表,这里的条件运算符和逗号之间的优先级还是存在一些差异的。
C++规定条件运算符的优先级高于逗号运算符,所以somevalue ? ++x,++y :- -x,- -y
实际上等价于(somevalue ? ++x,++y : - -x),- -y。
它的求值过程是,首先判断somevalue是否为真,如果为真,依次执行++x和++y,最后执行- -y;如果为假,执行- -x和- -y。
总结
这篇博客总结了一下运算优先级表,并举了一些简单和稍微复杂的例子作为辅助。后期在编程中遇到优先级问题,其实最好的方式我觉得是加括号。但是有时做题目,或者看别人的代码,理解时还需要脑子里有这个对照表。
更多推荐
C/C++运算优先级
发布评论