为什么该程序输出4?

时间:2018-08-31 04:23:58

标签: c

使用define preprocessor指令,为什么跟随程序输出4而不是3?

#include <stdio.h>
#define MAX(A,B)((A)>(B)) ? A : B

int max_t(int a, int  b)
{
  return ((a)>(b)) ? a : b; 
}

int main()
{
  int i=1;
  int j=2;
  int val = MAX(++i, ++j); // this outputs 4 but why?
  //int val = max_t(++i, ++j);
  printf("%d\n", val);
  return 0;
}

2 个答案:

答案 0 :(得分:7)

宏仅仅是代币的替代品,所以

MAX(++i, ++j);

扩展到

((++i) > (++j)) ? ++i : ++j;

如您所见,在这种情况下,对参数进行了两次评估(并递增),因此输出为4

答案 1 :(得分:3)

 int main()
 {
   int i=1;
  int j=2;
  int val = ((++i)>(++j)) ? ++i : ++j;

   printf("%d\n", val);
  return 0;
 }

这是在预处理阶段(宏扩展之后)之后发生的事情,您可以通过linux gcc编译器中的“ cc -E file.c -o file.i”命令进行检查,此扩展代码位于文件的最后。

所以在这里:val =(2> 3?3:4),将这4存储到val中,这就是为什么val = 4的原因。