黑马程序员技术交流社区

标题: 关于C中逻辑运算短路问题 [打印本页]

作者: qq358556392    时间: 2015-7-3 13:00
标题: 关于C中逻辑运算短路问题
本帖最后由 qq358556392 于 2015-7-3 13:11 编辑

还在看基础视频,一个逻辑运算短路的问题一直有点疑惑,
视频里讲的如下
#include<stdio.h>
int main ( ){
     int x,y,z;
    x=y=z=0;
    result=++x || y++ && ++z;                        
    printf("result = %d\n",result);                          //这里输出result = 1
    printf("x = %d,y = %d, z = %d\n",x,y,z);          //这里输出x = 1,y = 0,z = 0
    return 0;
}
自增运算优先级为2,先算自增没问题,
但是 && 的优先级为11,而 | | 的优先级为12,先运算的是 y++ && ++z,就不存在&&短路的情况,而是||被短路。
最后输出的应该x = 0,y = 1,z = 1
然而最终输出的是x = 1,y = 0,z = 0,是&&被短路后的结果。
疑惑就是:短路不符合优先级的规则啊?


作者: qq358556392    时间: 2015-7-3 15:29
没人来?
作者: heyuze    时间: 2015-7-3 15:36
result=++x || y++ && ++z;  
你这么想,自增是最优先的。
所以执行这一句的时候先从左到右 result = ++x ,这里x先自加1,x=1了  ,再执行到 "||",这里程序已经结束了。
有真为真,result直接被赋值1了,也就是说后面有没有&&已经不重要了。程序根本不用管以后的,也不管你"||"和"&&"优先级问题。
程序是执行到 "result = 1 ||" 已经结束。
作者: qq358556392    时间: 2015-7-3 15:39
heyuze 发表于 2015-7-3 15:36
result=++x || y++ && ++z;  
你这么想,自增是最优先的。
所以执行这一句的时候先从左到右 result = ++x  ...

谢谢,大概能理清楚了,
作者: yangzhen5352    时间: 2015-7-3 16:17
顶顶顶顶现在……
作者: 4B青年    时间: 2015-7-3 17:34
我也是这个困惑,不过应该就跟3楼的说法一样,属于电脑运行的机制问题吧。。。
作者: 丁铭检    时间: 2015-7-3 18:05
在执行一条语句之前,计算机会先逐个扫描一遍。如果都为真,则会根据优先级来算,否则就不会按照优先级的运算规则。。
作者: neobug    时间: 2015-7-3 21:15
我当时也是有点疑惑
作者: slj900926    时间: 2015-7-3 22:01
多多提问,会有大神解答的
作者: tao13yang    时间: 2015-7-4 00:16
楼主在细节扣的太死了,面向对象时会很痛苦的。
作者: qq358556392    时间: 2015-7-4 11:53
tao13yang 发表于 2015-7-4 00:16
楼主在细节扣的太死了,面向对象时会很痛苦的。

不扣细节,面向对象好学的话,我就不扣了
作者: zhangnan110    时间: 2015-7-11 21:51
之前一直不懂来着。
作者: 黑马灬小胖纸    时间: 2015-7-11 21:57
过来看看,顺便向大神学习




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