黑马程序员技术交流社区

标题: 短路问题 [打印本页]

作者: gundana121    时间: 2015-7-22 21:09
标题: 短路问题
int x,y,z;
x=y=z=0;
++x || ++y && z++;
y为什么是0
++级别最高,算完了才与之后在或啊,他问什么短路啊
作者: lixiaopeng    时间: 2015-7-22 21:20
逻辑或运算符有个性质:当它的第一个操作数为 true 或者非0时,则不对第二个操作数进行运算.
作者: zpy_0806    时间: 2015-7-22 21:24
++x   一看是1,为真,对于或运算符来说,它的总的结果一定是真了,所以系统默认不再继续往下运算,所以++y根本就没有运算,y依然为零
作者: gundana121    时间: 2015-7-22 21:27
zpy_0806 发表于 2015-7-22 21:24
++x   一看是1,为真,对于或运算符来说,它的总的结果一定是真了,所以系统默认不再继续往下运算,所以++y ...

好吧就这么认为吧
作者: 杨远鹏    时间: 2015-7-22 21:32
原来是酱紫,我也算明白了
作者: tingyuyisheng    时间: 2015-7-22 21:42
我也对这个感到有点疑惑
作者: 花漾    时间: 2015-7-22 22:16
++X=1为真后面就不考虑了,所以Y还为0
作者: qq103613    时间: 2015-7-22 22:21
++x非零  ++y被短路没被执行  所以为零
作者: 小林儿    时间: 2015-7-22 22:28
++x最高,先算了,然后系统是先从左往右扫描,扫到 || 的时候,直接把后面的都跳过了。虽然&&级别高,但是系统就这么任性。你把这段代码打到电脑上会报错。你把&&加个()估计会好,但是结果还是y=0.
作者: Northcity    时间: 2015-7-22 22:54
我知道你的疑惑是, 为什么不是先执行优先级高的,但是计算机是按顺序编译和执行程序 不会跳跃执行
好多人对运算符优先级有误区:  运算符优先级是指他们的结合性优先级(谁的优先级别高,操作数与谁最先结合), 并不是指运算先后优先级.      
  运算符并没有说他们运算次序是什么,有得编译器是从左往右,有的是从右往左 还有的编译器是两边同时进行  这个和编译器和系统环境有关.
但是不管C语言规定   ||   &&  和条件运算符强制从左往右运算 , 比如 ||  当左值确定为真,  右值不用进行运算        
作者: 午夜码农    时间: 2015-7-22 22:55
后面所有运算全部不执行了,值都是0,查下字典:逻辑短路
作者: liusuizuoyou    时间: 2015-7-22 23:04
++x || ++y && z++;    等价于  ++x || (++y && z++);   前面的++x 成立了  后面就不再运行咯
作者: alanwangke213    时间: 2015-7-23 15:05
||或运算,从左到右,左边++x为1也就是帧了,那么后面就不计算了。直接返回真。所以y是0
作者: 王训印    时间: 2015-7-23 15:59
++x运算后,x变成1,||后面的就不执行
作者: noway190    时间: 2015-7-23 16:03
同上。。。。。。。。。。。。。
作者: 被水淹死的鱼    时间: 2015-7-23 16:58
原来这么简单。。。
作者: wy911011    时间: 2015-7-23 17:07
或运算++x已经为真了,就没必要在计算了
作者: gundana121    时间: 2015-7-23 17:07
Northcity 发表于 2015-7-22 22:54
我知道你的疑惑是, 为什么不是先执行优先级高的,但是计算机是按顺序编译和执行程序 不会跳跃执行
好多人对 ...

相当有道理,谢谢,领教了
作者: gundana121    时间: 2015-7-23 17:09
小林儿 发表于 2015-7-22 22:28
++x最高,先算了,然后系统是先从左往右扫描,扫到 || 的时候,直接把后面的都跳过了。虽然&&级别高,但是 ...

这个不报错,在视频上看到的,运行了没问题,不过你这个言简意赅的系统任性完美解决我的疑问
作者: Foreversidy夏末    时间: 2015-7-23 17:20
根据逻辑或一真则真的原则,如果++x表达式为真(1)就不用执行||后面的表达式,y和z为原值;如果++x表达式为假(0)就需要判断||后面的表达式的真假
作者: zpy_0806    时间: 2015-7-23 18:59
gundana121 发表于 2015-7-22 21:27
好吧就这么认为吧

本来就是这样啊
作者: 刨丁    时间: 2015-7-23 22:25
++x是先加一再运算所以"或"运算是真就不会再执行"与"运算还有++y和z++运算都不会执行这就是逻辑短路.
作者: FreshMAN15    时间: 2015-7-24 00:07
++x为1,所以||后面的++y不用操作表达式++x||++y也为真,所以就不执行++y,所以y为0
作者: 蓝蓝    时间: 2015-7-24 02:17
我也跟着学习了!!
作者: 小林儿    时间: 2015-7-24 21:59
Foreversidy夏末 发表于 2015-7-23 17:20
根据逻辑或一真则真的原则,如果++x表达式为真(1)就不用执行||后面的表达式,y和z为原值;如果++x表达式 ...

班长解释的很详细!:)




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2