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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

今天看了老师的视频有如下内容:
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

还请赐教,多谢!

8 个回复

正序浏览
u37kl 中级黑马 2016-2-18 14:36:42
9#
杨冬武 发表于 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:35:34
8#
杨冬武 发表于 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
回复 使用道具 举报
曦正 中级黑马 2016-2-10 10:18:04
7#
杨冬武 发表于 2016-2-9 22:55
你确定,我读书少,你别骗我,cpu执行预判,在下孤陋寡闻,还请普及一下,谢谢 ...

因为编译器优化了呗
回复 使用道具 举报
曦正 发表于 2016-2-9 15:20
因为CPU执行时会预判,如果从左往右执行的时候不会影响等式的执行结果,那么就直接执行,不看优先级,如果 ...

你确定,我读书少,你别骗我,cpu执行预判,在下孤陋寡闻,还请普及一下,谢谢
回复 使用道具 举报
u37kl 发表于 2016-2-8 11:20
电脑的执行过程应该是((++x) || (y++) ) && (z++);,&&从右向左执行,将(++x) || (y++) 看成整体了 ...

要是按你这么说,就是y++不执行,但是或之后的结果要和z++进行与运算,z++就得执行了,你这个也没有考虑优先级的问题
回复 使用道具 举报
u37kl 发表于 2016-2-8 11:20
电脑的执行过程应该是((++x) || (y++) ) && (z++);,&&从右向左执行,将(++x) || (y++) 看成整体了 ...

你这么说不对吧
回复 使用道具 举报
因为CPU执行时会预判,如果从左往右执行的时候不会影响等式的执行结果,那么就直接执行,不看优先级,如果因为优先级而影响到了等式的结果,那么才先执行优先级高的等式
回复 使用道具 举报
电脑的执行过程应该是((++x) || (y++) ) && (z++);,&&从右向左执行,将(++x) || (y++) 看成整体了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马