关于C/C++运算符优先级问题探讨

最近在知乎上看到一个c/c++运算符连写的问题,引发了诸多网友的讨论,具体内容如下图:

关于C/C++运算符优先级问题探讨

 

乍一看,这句代码很长,确实有些让人糊涂,尤其是学习过python的同学,对此写法不太理解,今天我们一起来说一说。

优先级

在c语言的表达式中,如果存在多个运算符的时候,需要考虑数据的优先级和结合方向的问题,例如:x = a + b * c -d在这个例子中,c语言的处理流程是:

1. 先做乘法b*c,

2. 然后先做加法,后做减法

3. 最后将计算结果赋值给x

我们验证一下:

关于C/C++运算符优先级问题探讨

 

1 + 2 *3 -4,结果为3,验证成功!

关于C/C++运算符优先级问题探讨

 

通过这个例子,我们可以总结如下:对于表达式

a op1 b op2 c ,它的运行逻辑有两种可能性:

1. 如果op1优先级高于op2,则为:(a op1 b) op2 c

2. 如果op2优先级高于op1,则为:a op1 (b op2 c)

如果op1与op2优先级相同,则取决于结合方向。所谓结合方向指的是"从左至右"或"从右至左"。

结合方向

关于结合方向,我们一起来探讨一下,还是刚刚的例子:x = a+b *c -d,这里面有二元运算和赋值运算,在c语言中:

· 赋值运算的结合方向为:从右至左

· 二元运算符的结合方向为:从左至右

我们假设 b*c 的值为m,则,

· a + m -d 可以翻译为 (a + m) -d,,结合方向是从左至右

· x = a + m -d 可以翻译为: x = (a + m -d),结合方向是从右至左

在C/C++中,所有的运算符都有明确的优先级和结合方向定义,具体如下:

关于C/C++运算符优先级问题探讨

 

问题解答

铺垫好了知识点,我们回归到最初网友的问题上,x +=5 ==4,

由于==号的优先级大于+=号,所以这句代码的逻辑可以解读为:

1. x += (5 ==4)

2. 即先判断 5 == 4是否成立,此时不成立,返回false,即返回0

3. 然后再计算x+=0,所以最终结果为0。

使用代码验证一下:

关于C/C++运算符优先级问题探讨

 

执行结果:

关于C/C++运算符优先级问题探讨

 

可以看到,输出的结果依然为10,说明x添加的值为0,得到验证。

接下来,我们修改一下代码,让两个数字比较值返回true,再次验证一下结果,如下图:

关于C/C++运算符优先级问题探讨

 

执行结果:

关于C/C++运算符优先级问题探讨

 

进一步思考

对于这种x +=5 ==4表达式的编码风格,我们在开发中是不建议的,这样写虽然高效简洁、正确运行、看起来很酷,但是存在一个风险,即需要人进一步确认这种表达式是否就是开发人员的真正意图。我们在公司开发的时候,通常是很多同事协同开发,当同事看到这类代码的时候,会产生怀疑,从而增加彼此的沟通成本。我们在编码的时,尽量不要让人产生歧义,如果一定想要写这种风格的代码,我建议加上括号,即:x +=(5 == 4),这样语义更加明确,从而也避免造成同事因揣摩代码而带来的苦恼。

当然,深刻的理解语法是我们必须要做到的,这种代码常见于面试题中,对于考察面试者对语法的理解程度是个不错的选择。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值