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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

梦想家z

中级黑马

  • 黑马币:-54

  • 帖子:34

  • 精华:0

今天在论坛看到同学发的帖子
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.编译器会自动选择最优方式来运行,避免优先级带来的冗余运算

求大神解答,这个坑困扰了我们一整天了

2 个回复

正序浏览
这运算优先级的问题真是坑死多少人.在逗号表达式中      
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.
可计算机显示的结果是俩个都一样....我就搞不懂了
回复 使用道具 举报
在线求大神回复~~~~~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马