C/C++运算优先级

前言

最近复习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。


总结

这篇博客总结了一下运算优先级表,并举了一些简单和稍微复杂的例子作为辅助。后期在编程中遇到优先级问题,其实最好的方式我觉得是加括号。但是有时做题目,或者看别人的代码,理解时还需要脑子里有这个对照表。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

澄澈i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值