为什么“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); }
现代编译器将在尊重函数调用的原始行为的同时对其进行内联。