为什么“i”变量在我的程序中增加两倍?

我的一位朋友向我展示了这个程序并问我为什么变量增加两倍。

根据我的理解MAX(i++, ++j); 在这一行中, i首先作为参数发送然后递增,所以如果i的初始值是10则递增的值应该是11 ,但是它将i的递增值显示为12

计划:

 #include #define MAX(x,y) (x)>(y)?(x):(y) void main(void) { int i = 10; int j = 5; int k = 0; k = MAX(i++, ++j); printf("%d %d %d",i,j,k); } 

输出:

12 6 11

有人可以解释一下我的价值是如何增加到12的?

谢谢。

你的宏替换意味着你写(i++)>(++j)?(i++):(++j)

MAX是宏,不是函数。 在您的用例中,它扩展为:

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

您的宏定义包含两次参数

 #define MAX(x,y) (x)>(y)?(x):(y) 

这使得

  k = MAX(i++, ++j); 

扩展到

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

因此,增加两倍。

MAX不是一个function。 i不是作为参数发送的。

MAX是一个宏。 它在使用时被文本替换:

 k = (i++)>(j++)?(i++):(j++) 

现在你知道为什么它会增加两倍。

宏做简单的文本替换,所以宏扩展后, k = MAX(i++, ++j); 编译器将该行视为:

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

你的MAX宏扩展为

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

显示为什么你得到双增量。

宏将扩展为伪C代码:

 if( i++ > j++) // i is incremented the first time, j is incremented once return i++; // i is incremented the second time else return j++; // we never go there, so j is not incremented twice 

使用MAX(i++, ++j) ,生成的代码为:

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

使用预处理器宏只需展开代码并将参数复制/粘贴到位。 您可能希望在这种情况下使用函数。

 int max(int x, int y) { return (x > y ? x : y); } 

现代编译器将在尊重函数调用的原始行为的同时对其进行内联。