今天在论坛看到同学发的帖子
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.编译器会自动选择最优方式来运行,避免优先级带来的冗余运算
求大神解答,这个坑困扰了我们一整天了
|
|