黑马程序员技术交流社区
标题:
关于逻辑运算的优先级和短路问题
[打印本页]
作者:
梦想家z
时间:
2016-2-3 00:07
标题:
关于逻辑运算的优先级和短路问题
今天在论坛看到同学发的帖子
int x = 1,y = 1,z = 1;
(++x)||(y++)&&(z++);
printf("x = %d,y = %d,z = %d",x,y,z);
结果为2,1,1
违反了()的最大优先级和老师讲的,优先判断&&的左边这个规则;
于是我们在群里进行了讨论,
新程序:
int x = 1,y = 1,z = 1,a = 1;
(x++)||(y++)&&(z++)||(a++);
printf("x = %d,y = %d,z = %d,a = %d",x,y,z,a);
结果为2,1,1,1;
int x = 0,y = 1,z = 1,a = 1;
(x++)||(y++)&&(z++)||(a++);
printf("x = %d,y = %d,z = %d,a = %d",x,y,z,a);
结果为1,2,2,1,运行到了z,从左往右
int x = 0,y = 0,z = 0,a = 1;
(x++)||(y++)&&(z++)||(a++);
printf("x = %d,y = %d,z = %d,a = %d",x,y,z,a);
结果为1,1,0,2,运行到了a,但是由于y为0,跳过了z的判断
int x = 0,y = 0,z = 0,a = 0;
(x++)||(y++)&&(z++)||(a++);
printf("x = %d,y = %d,z = %d,a = %d",x,y,z,a);
结果为1,1,0,1,与上一个一样
int x = 0,y = 0,z = 0,a = 0;
(x++)||(y++);
printf("x = %d,y = %d,z = %d,a = %d",x,y,z,a);
然后是这个,在这个程序里面,结果为x = 1,y = 1;证明在逻辑运算中,根本不考虑括号的问题,
总结一下,在逻辑运算中,可不可以这样认为:
1.不考虑括号的最大优先级,甚至在自加自减运算的时候()不起任何作用;
2.不考虑||和&& 优先级的问题,直接从左到右运算,直到得出表达式的真假值,或者说在||和&&同时出现的情况下,不考虑优先级
3.编译器会自动选择最优方式来运行,避免优先级带来的冗余运算
求大神解答,这个坑困扰了我们一整天了
作者:
曦正
时间:
2016-2-3 00:09
在线求大神回复~~~~~
作者:
一步一脚印=-=
时间:
2016-2-10 09:32
这运算优先级的问题真是坑死多少人.在逗号表达式中
result = (a++,(a+3,b+5,z=a+b));
result1 = (a++,a+3,b+5,z=a+b);
我认为上面的括号优先级最高,应该先算括号里的逗号表达式,那么值就是z的值然后再与a++构成另一个逗号表达式.值还是z.
而下面的逗号表达式是从左往右预算,所以a的值会自增1.z的值也应该比上面的值多1.
可计算机显示的结果是俩个都一样....我就搞不懂了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2