黑马程序员技术交流社区

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

作者: 杨冬武    时间: 2016-1-31 22:52
标题: 关于C语言逻辑运算符短路问题
今天看了老师的视频有如下内容:
int x = 1,y = 1,z =1;
(++x) || (y++) && (z++);
printf("x = %d,y = %d,z = %d\n",x,y,z);
结果为:
x = 2,y = 1,z = 1
解释为(++x)为1之后程序或短路,这样后面的就不执行了

小弟新人,初级黑马,有一疑问

&&的优先级为11,||的优先级为12,为什么不是先运算&&,在进行||的运算
相当于给后面加了个括号
如下:
(++x) || ((y++) && (z++));
这样不是y++和z++都会进行运算
输出结果为:
x = 2,y = 2,z = 2

还请赐教,多谢!
作者: u37kl    时间: 2016-2-8 11:20
电脑的执行过程应该是((++x) || (y++) ) && (z++);,&&从右向左执行,将(++x) || (y++) 看成整体了
作者: 曦正    时间: 2016-2-9 15:20
因为CPU执行时会预判,如果从左往右执行的时候不会影响等式的执行结果,那么就直接执行,不看优先级,如果因为优先级而影响到了等式的结果,那么才先执行优先级高的等式
作者: 杨冬武    时间: 2016-2-9 22:48
u37kl 发表于 2016-2-8 11:20
电脑的执行过程应该是((++x) || (y++) ) && (z++);,&&从右向左执行,将(++x) || (y++) 看成整体了 ...

你这么说不对吧
作者: 杨冬武    时间: 2016-2-9 22:51
u37kl 发表于 2016-2-8 11:20
电脑的执行过程应该是((++x) || (y++) ) && (z++);,&&从右向左执行,将(++x) || (y++) 看成整体了 ...

要是按你这么说,就是y++不执行,但是或之后的结果要和z++进行与运算,z++就得执行了,你这个也没有考虑优先级的问题
作者: 杨冬武    时间: 2016-2-9 22:55
曦正 发表于 2016-2-9 15:20
因为CPU执行时会预判,如果从左往右执行的时候不会影响等式的执行结果,那么就直接执行,不看优先级,如果 ...

你确定,我读书少,你别骗我,cpu执行预判,在下孤陋寡闻,还请普及一下,谢谢
作者: 曦正    时间: 2016-2-10 10:18
杨冬武 发表于 2016-2-9 22:55
你确定,我读书少,你别骗我,cpu执行预判,在下孤陋寡闻,还请普及一下,谢谢 ...

因为编译器优化了呗
作者: u37kl    时间: 2016-2-18 14:35
杨冬武 发表于 2016-2-9 22:51
要是按你这么说,就是y++不执行,但是或之后的结果要和z++进行与运算,z++就得执行了,你这个也没有考虑 ...

你用xcode这样写(++x) || (y++) && (z++);,xcode没有报警告吗,"&& within ||"。你这样的写法模棱两可,xcode看到你这样写,会给出一个建议写法(++x) || ( (y++) && (z++));,xcode认为你的意思是这样的。所以 ||前后都有一个括号,&&的优先级再大也打不过括号,所以先执行++x,成立,然后忽略 || 后面的内容,因此结果就是x = 2,y = 1,z = 1
作者: u37kl    时间: 2016-2-18 14:36
杨冬武 发表于 2016-2-9 22:51
要是按你这么说,就是y++不执行,但是或之后的结果要和z++进行与运算,z++就得执行了,你这个也没有考虑 ...

你用xcode这样写(++x) || (y++) && (z++);,xcode没有报警告吗,"&& within ||"。你这样的写法模棱两可,xcode看到你这样写,会给出一个建议写法(++x) || ( (y++) && (z++));,xcode认为你的意思是这样的。所以 ||前后都有一个括号,&&的优先级再大也打不过括号,所以先执行++x,成立,然后忽略 || 后面的内容,因此结果就是x = 2,y = 1,z = 1




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