A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 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的
不理解,求大牛说说

18 个回复

倒序浏览
本帖最后由 65006636 于 2015-8-13 10:42 编辑

首先这段代码只能作为试验,实际开发中切勿这样写。
然后讲所谓的运算符优先级并非运算优先级,而是一种结合性优先级,而&&等逻辑运算符的运算优先级是高于++的。打个比方,a = b + c * d;程序其实是从a开始“扫描”a,=,到这里编译器知道了a会获得一个赋值,然后b +,这里编译器会知道会知道这个赋值是一个和,然后才是c*d,这是运算优先级,在这里是从左到右的。它是发生在结合性优先级之前的然后才是发挥结合性优先级特性,“先乘除后加减再赋值”,这就是a = b + c * d的中发生的全部事情。
回到这个问题,编译器首先“扫描”过x||之后已经得出 end = 1,尽管后面的()和++结合性优先级再高,也不会被运算了。
这里的结合性优先级可能用词的不是很准确,但是这不是关键,关键在于“编译器和人一样,不是优先级高的运算符就会被第一眼看见,而是看完一个语句中的所有运算符,才知道谁高谁低。”说的比较绕,希望对你有帮助。
回复 使用道具 举报 1 0
所以这才叫短路,要是后面也进行运算了,那不就是没短路么;
逻辑运算符左边已经可以得出整个表达式的结果了,右边直接不执行,无论右边优先级多高,都不执行了,就不关优先级事情了
回复 使用道具 举报
因为(的优先级最低,所以读入到||到时候,发现= 的优先级大于||就先计算了end=x,又遇到了 (发现 ||的优先级大于(,所以又计算了||,就有结果了,后边的都不读入了。
回复 使用道具 举报
傻傻分不不清楚
回复 使用道具 举报
65006636 发表于 2015-8-13 10:37
首先这段代码只能作为试验,实际开发中切勿这样写。
然后讲所谓的运算符优先级并非运算优先级,而是一种结 ...

嗯嗯,谢谢这么详细,我也有考虑过是不是程序要一步步扫描的问题,还是一直太纠结于优先级了
但是++的优先级是第二级,&&的优先级是第十一级,还是++的高
回复 使用道具 举报
wowthe1st 发表于 2015-8-13 11:16
所以这才叫短路,要是后面也进行运算了,那不就是没短路么;
逻辑运算符左边已经可以得出整个表达式的结果 ...

嗯嗯,上面一楼说的扫描我感觉应该是这样,先扫描到这里所以直接执行了,后面直接短路了就不执行了,谢谢~
回复 使用道具 举报
Eil.tea 发表于 2015-8-13 11:47
因为(的优先级最低,所以读入到||到时候,发现= 的优先级大于||就先计算了end=x,又遇到了 (发现 ||的优 ...

=的优先级是第十四级,||是第十二级,还是||高
回复 使用道具 举报
Eil.tea 发表于 2015-8-13 11:47
因为(的优先级最低,所以读入到||到时候,发现= 的优先级大于||就先计算了end=x,又遇到了 (发现 ||的优 ...

=的优先级是第十四级,||是第十二级,还是||高
回复 使用道具 举报
norwood 发表于 2015-8-13 11:58
傻傻分不不清楚

你好好看看我们评论回复的,解释的挺好的都~
回复 使用道具 举报
wanghui001001 发表于 2015-8-13 12:19
=的优先级是第十四级,||是第十二级,还是||高

看错了,想成==了,解释是没问题的,||和(的优先级比较。表达式运算的方式都是存到栈结构中(这里的栈说的是存储方式,不是内存的栈),先进后出,遇到比自己运算级别低的就出来参与运算。||遇到(,先计算||,因为前边已经为真了,||后边的都不参与计算了,后边的数据和运算符压根就没进栈,所以后边的不执行。
回复 使用道具 举报
本帖最后由 65006636 于 2015-8-13 13:15 编辑
wanghui001001 发表于 2015-8-13 12:15
嗯嗯,谢谢这么详细,我也有考虑过是不是程序要一步步扫描的问题,还是一直太纠结于优先级了
但是++的优 ...

楼上说的挺有道理的
回复 使用道具 举报
Eil.tea 发表于 2015-8-13 12:58
看错了,想成==了,解释是没问题的,||和(的优先级比较。表达式运算的方式都是存到栈结构中(这里的栈说 ...

恩恩,我还得继续看,谢谢啦,你已经进入黑马了嘛
回复 使用道具 举报
计算机运行是有顺序的,x || () 这个式子,因为x==1计算机看到是或运算符会直接运算出整个式子==1就不会再看后面括号的内容了,也就是说后面的变量维持不变
回复 使用道具 举报 1 0
wanghui001001 发表于 2015-8-13 15:24
恩恩,我还得继续看,谢谢啦,你已经进入黑马了嘛

这周面试,不知道有没有机会做同学
回复 使用道具 举报
越看越纠结,眼花了。
回复 使用道具 举报
||后面都不运算了,因为x=1为真
回复 使用道具 举报
Eil.tea 发表于 2015-8-13 18:09
这周面试,不知道有没有机会做同学

我准备明年第一期去呢。。。。。有木有试题共享一下,练练手~
回复 使用道具 举报
学习学习!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马