前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >短路求值问题

短路求值问题

作者头像
用户6755376
发布2020-01-16 11:33:27
1K0
发布2020-01-16 11:33:27
举报

欢迎关注微信公众号:计算机二级C语言 ,获取更多信息。

在昨天的文章中,我们已经提到了优先级与求值顺序无关(C语言运算符优先级,涉及到的还有短路求值(short-circuit evaluation)问题,接下来具体讲一下。

在逻辑表达式的求值过程中,按其操作数从左至右的计算顺序,当某个操作数的值可以确定整个逻辑表达式的值时,其余的操作数不再计算。

逻辑运算符“&&”和“||”都具有短路特性。

  1. 逻辑与的短路特性 a&&b 只有a为真时,才需要判断b的值,如果a为假时,就不必判断b的值,表达式的结果始终为假,则b被短路。
  2. 逻辑或的短路特性 a||b 只有a为假,才需要判断b的值。如果a为真,就不必判断b值,表达式的结果始终为真,则b被短路。

有同学会说,这也没啥影响啊,只是计算机处理的时候步骤优化变少了,我们按照优先级顺序计算也是一样的结果。

正常计算结果是没有影响的,但涉及到自增自减、赋值运算的时候,有没有被短路就有区别了。如下图,按照优先级顺序,自增自减运算优先级高,数值应该发生变化,但涉及到短路求值问题,被短路的部分并没有执行,数值也就没有变化。

在第一个式子中,计算顺序如下:

代码语言:javascript
复制
++x //先让x的值加1,再使用x
--y //先让y的值减1,再使用y
(++x)&&(--y) //即 2&&0,运算结果是0
(++x)&&(--y)&&++z 
/* 对于第二个逻辑运算&&,
   左边操作数已经是0了,
   右边被短路,++z没有执行,
   故z的值为1不变  */

其他的例子大家自行验证一下就好明白了。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-01-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 计算机二级C语言 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档