c - 为什么这个程序输出8?

标签 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;
}

最佳答案

简短的回答是“因为宏不是函数”。

长答案是宏参数被扩展到程序的文本中,所以 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 括起来来解决这个问题,但定义内联函数将是更好的选择。

关于c - 为什么这个程序输出8?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43410688/

相关文章:

c++ - 为什么 sqrt() 在没有为 int 定义的 int 变量上工作正常?

编译的枚举常量

gcc 可以生成不同大小的目标代码吗?

python - Cython、OS X 和链接错误

Cygwin、gcc 和 C_INCLUDE_PATH

c++ - __COUNTER__ 宏是否可移植?

c - Sudoku C 递归函数无法正常工作

比较C中的2个子串

c - 使用其他函数释放 C 内存时遇到问题

c - 如何获取 C 中多个条目的第一个字符?