不了解GCC编译器行为的条件表达式(测试)?值1:值2

时间:2018-02-09 11:57:42

标签: c gcc

奇怪的编译器行为?这是一个错误。在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

2 个答案:

答案 0 :(得分:6)

这不是错误。表达式

2 + (NSIM == 1) ? 0 : 99

分组为

(2 + (NSIM == 1)) ? 0 : 99

由于运营商优先权。 (三元条件运算符在运算符优先级表上显得相当低。)

因此,无论0的值如何,此评估结果为NSIM

答案 1 :(得分:3)

加法减法比三元条件?:precedence。结果证明是

(2 + (NSIM == 1)) ? 0 : 99

根据此顺序,这是正确的结果。

最好的方法是将每个你怀疑的表达都用括号括起来。这是一个简单的出路,这就是你在第二种情况下所做的事情。你不太可能记得每个操作员的优先顺序。