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。