Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么这个程序输出4?_C - Fatal编程技术网

C 为什么这个程序输出4?

C 为什么这个程序输出4?,c,C,使用define预处理器指令为什么以下程序输出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

使用define预处理器指令为什么以下程序输出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;
}
#包括
#定义最大值(A,B)((A)>(B))?A:B
整数最大值(整数a,整数b)
{
返回((a)>(b))?a:b;
}
int main()
{
int i=1;
int j=2;
int val=MAX(++i,+++j);//这会输出4,但为什么呢?
//int val=max_t(++i,+++j);
printf(“%d\n”,val);
返回0;
}

宏只是代币的替代品,因此

MAX(++i, ++j);
扩展到

((++i) > (++j)) ? ++i : ++j;
如您所见,在这种情况下,参数将被计算(并递增)两次,因此输出为
4

 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。

因为预处理器指令就是这样工作的。@Ashelly,你能解释一下吗?@eyllanesc不,不是那个。这里没有未定义的行为。@AnttiHaapala我理解,你是对的。:)这就是我想知道的。