黑马程序员技术交流社区
标题: 逻辑运算符的短路问题,求解~~~~ [打印本页]
作者: wanghui001001 时间: 2015-8-13 01:53
标题: 逻辑运算符的短路问题,求解~~~~
本帖最后由 wanghui001001 于 2015-8-13 02:17 编辑
int x,y,z,end = 0;
x = 1 , y = z = 0;
end = x || (++y && ++z);
输出的结果是:x = 1,y = 0,z = 0,end = 1
短路问题不看优先级嘛?
如果看,++是这里面最高优先级,也应该先看++y和++z,这样y和z的值应该也都是1,而x应该等于0的
不理解,求大牛说说
作者: 65006636 时间: 2015-8-13 10:37
本帖最后由 65006636 于 2015-8-13 10:42 编辑
首先这段代码只能作为试验,实际开发中切勿这样写。
然后讲所谓的运算符优先级并非运算优先级,而是一种结合性优先级,而&&等逻辑运算符的运算优先级是高于++的。打个比方,a = b + c * d;程序其实是从a开始“扫描”a,=,到这里编译器知道了a会获得一个赋值,然后b +,这里编译器会知道会知道这个赋值是一个和,然后才是c*d,这是运算优先级,在这里是从左到右的。它是发生在结合性优先级之前的。然后才是发挥结合性优先级特性,“先乘除后加减再赋值”,这就是a = b + c * d的中发生的全部事情。
回到这个问题,编译器首先“扫描”过x||之后已经得出 end = 1,尽管后面的()和++结合性优先级再高,也不会被运算了。
这里的结合性优先级可能用词的不是很准确,但是这不是关键,关键在于“编译器和人一样,不是优先级高的运算符就会被第一眼看见,而是看完一个语句中的所有运算符,才知道谁高谁低。”说的比较绕,希望对你有帮助。
作者: wowthe1st 时间: 2015-8-13 11:16
所以这才叫短路,要是后面也进行运算了,那不就是没短路么;
逻辑运算符左边已经可以得出整个表达式的结果了,右边直接不执行,无论右边优先级多高,都不执行了,就不关优先级事情了
作者: Eil.tea 时间: 2015-8-13 11:47
因为(的优先级最低,所以读入到||到时候,发现= 的优先级大于||就先计算了end=x,又遇到了 (发现 ||的优先级大于(,所以又计算了||,就有结果了,后边的都不读入了。
作者: norwood 时间: 2015-8-13 11:58
傻傻分不不清楚
作者: wanghui001001 时间: 2015-8-13 12:15
嗯嗯,谢谢这么详细,我也有考虑过是不是程序要一步步扫描的问题,还是一直太纠结于优先级了
但是++的优先级是第二级,&&的优先级是第十一级,还是++的高
作者: wanghui001001 时间: 2015-8-13 12:16
嗯嗯,上面一楼说的扫描我感觉应该是这样,先扫描到这里所以直接执行了,后面直接短路了就不执行了,谢谢~
作者: wanghui001001 时间: 2015-8-13 12:18
=的优先级是第十四级,||是第十二级,还是||高
作者: wanghui001001 时间: 2015-8-13 12:19
=的优先级是第十四级,||是第十二级,还是||高
作者: wanghui001001 时间: 2015-8-13 12:46
你好好看看我们评论回复的,解释的挺好的都~
作者: Eil.tea 时间: 2015-8-13 12:58
看错了,想成==了,解释是没问题的,||和(的优先级比较。表达式运算的方式都是存到栈结构中(这里的栈说的是存储方式,不是内存的栈),先进后出,遇到比自己运算级别低的就出来参与运算。||遇到(,先计算||,因为前边已经为真了,||后边的都不参与计算了,后边的数据和运算符压根就没进栈,所以后边的不执行。
作者: 65006636 时间: 2015-8-13 13:09
本帖最后由 65006636 于 2015-8-13 13:15 编辑
楼上说的挺有道理的
作者: wanghui001001 时间: 2015-8-13 15:24
恩恩,我还得继续看,谢谢啦,你已经进入黑马了嘛
作者: DUKEMAN 时间: 2015-8-13 15:33
计算机运行是有顺序的,x || () 这个式子,因为x==1计算机看到是或运算符会直接运算出整个式子==1就不会再看后面括号的内容了,也就是说后面的变量维持不变
作者: Eil.tea 时间: 2015-8-13 18:09
这周面试,不知道有没有机会做同学
作者: 红双喜 时间: 2015-8-13 19:06
越看越纠结,眼花了。
作者: 李艳兵 时间: 2015-8-13 19:20
||后面都不运算了,因为x=1为真
作者: wanghui001001 时间: 2015-8-13 21:34
我准备明年第一期去呢。。。。。有木有试题共享一下,练练手~
作者: chensc 时间: 2015-8-14 05:52
学习学习!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |