为什么这个程序输出8?

时间:2017-04-14 11:32:03

标签: c gcc c-preprocessor ternary-operator preprocessor-directive

#include <stdio.h>
#define abs(x) x > 0 ? x : -x

int main(void) {
  printf("%d\n", abs(abs(3 - 5)));
  return 0;
}

为什么上面的程序输出8而不是2,而下面的程序输出2?

#include <stdio.h>

int abs(int x) {
  return x > 0 ? x : -x;
}

int main(void) {
  printf("%d\n", abs(abs(3 - 5)));
  return 0;
}

1 个答案:

答案 0 :(得分:2)

简短回答是&#34;因为宏不是函数&#34;。

很长的答案是宏参数被扩展到程序的文本中,所以C编译器会看到这个长表达式:

3 - 5 > 0 ? 3 - 5 : -3 - 5 > 0 ? 3 - 5 > 0 ? 3 - 5 : -3 - 5 : -3 - 5 > 0 ? 3 - 5 : -3 - 5

在扩展中,负号适用于3,而不适用于(3-5),产生负数8。

虽然您可以通过在宏定义中的x附近放置括号来解决此问题,但定义内联函数将是更好的选择。