奇怪的编译器行为?这是一个错误。在Linux上使用GCC
#include <stdio.h>
#define NSIM 1
int main()
{
printf("%d\n\n",(2 +(NSIM==1)?0:99));
return 0;
}
给出输出0(NSIM = 1)
但
#include <stdio.h>
#define NSIM 1
int main()
{
printf("%d\n\n",(2 +((NSIM==1)?0:99)));
return 0;
}
给出输出2
这是编译器中的错误 - 在我看来他们都应该给2
答案 0 :(得分:6)
这不是错误。表达式
2 + (NSIM == 1) ? 0 : 99
分组为
(2 + (NSIM == 1)) ? 0 : 99
由于运营商优先权。 (三元条件运算符在运算符优先级表上显得相当低。)
因此,无论0
的值如何,此评估结果为NSIM
。
答案 1 :(得分:3)
加法减法比三元条件?:
高precedence。结果证明是
(2 + (NSIM == 1)) ? 0 : 99
根据此顺序,这是正确的结果。
最好的方法是将每个你怀疑的表达都用括号括起来。这是一个简单的出路,这就是你在第二种情况下所做的事情。你不太可能记得每个操作员的优先顺序。