我的一位朋友向我展示了这个程序并问我为什么i
变量增加了两次。
根据我的理解MAX(i++, ++j);
在这一行中i
首先作为参数发送然后递增,所以如果i
的初始值是10
则递增值应为11
,但它会将i
的递增值显示为12
。
计划:
#include<stdio.h>
#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?
感谢。
答案 0 :(得分:8)
MAX
是一个宏,而不是一个函数。在您的用例中,它扩展为:
k = (i++) > (++j) ? (i++) : (++j);
答案 1 :(得分:5)
您的宏替换意味着您编写(i++)>(++j)?(i++):(++j)
。
答案 2 :(得分:5)
您的宏定义包含两次参数
#define MAX(x,y) (x)>(y)?(x):(y)
哪个
k = MAX(i++, ++j);
扩展到
k = (i++)>(++j)?(i++):(j++);
因此,增加两倍。
答案 3 :(得分:4)
MAX
不是一个功能。 i
不会作为参数发送。
MAX
是一个宏。它在文字替换的地方使用:
k = (i++)>(j++)?(i++):(j++)
现在您知道为什么它会增加两次。
答案 4 :(得分:2)
宏执行简单的文本替换,因此在宏扩展之后,编译器将k = MAX(i++, ++j);
行视为:
k = (i++)>(++j)?(i++):(++j);
答案 5 :(得分:2)
您的MAX
宏扩展为
(i++)>(++j)?(i++):(++j)
显示你获得双倍增量的原因。
答案 6 :(得分:2)
宏将扩展为伪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
答案 7 :(得分:1)
使用MAX(i++, ++j)
时,生成的代码为:
(i++) > (++j) ? (i++) : (++j)
使用预处理器宏只需展开代码并复制/粘贴参数。您可能希望在这种情况下使用函数。
int max(int x, int y)
{
return (x > y ? x : y);
}
现代编译器会在尊重函数调用的原始行为的同时对其进行内联。