首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C语言缺陷OR圈套

2013-07-04 
C语言缺陷OR陷阱?int a,b,cabc1++a||++b&&++cprintf(“%d, %d, %d\n”, a, b, c)按照优先级应该先执

C语言缺陷OR陷阱?
int a,b,c;
     a=b=c=1;
     ++a||++b&&++c;
printf(“%d, %d, %d\n”, a, b, c);
按照优先级应该先执行&&,在执行||;为什么在这里不是这样的? C
[解决办法]
这不是缺陷也不是陷阱。优先级与计算顺序是不同的。

优先级决定了编译器如何理解你写的表达式。按照优先级规则,先把++与b结合,再把++与c结合,再把++与a结合这是三个“一元表达式”,然后是++b、&&、++c结合,成为“逻辑与表达式”,最后再与++a、
[解决办法]
结合,成为“逻辑或表达式”,因此这个表达式的值是个bool型。

语法分析完成后,编译器开始生成代码,这时C一般没有规定计算顺序,这一点由编译器决定,以便于优化处理。

但是,
[解决办法]
与&&是C中少有的规定了计算顺序的表达式,C要求编译器必须从左向右算起,当计算结果可以获知整个表达式的终值时,就要停止计算。

 ++a
[解决办法]
++b&&++c;
这个表达式就是先计算++a,值为2,非零,后面是逻辑或,无论后面的子表达式值为多少,结果都为真,所以要停止计算,++b与++c不执行。
结果a==2,b==1,c==1。

热点排行