正如我在 C 中所知,函数评估的实际参数的传递从最右边开始并从定向到左边开始。 带参数的宏定义是什么情况?我制作了一个代码,使感觉清晰,但输出混淆了我...... 这是代码。,
#define parsing(a,b) a*b
int parsefun(int a, int b)
{
return a*b;
}
int main()
{
int i=10;
printf("%d\n",parsing((i++),i));
i=10;
printf("%d\n",parsing(i,(i++)));
i=10;
printf("%d\n",parsefun((i++),i));
i=10;
printf("%d\n",parsefun(i,(i++)));
system("PAUSE");
return 0;
}
此代码输出, 100 100 100 110
我希望宏的相同输出作为函数。但这里的关键点在哪里?
答案 0 :(得分:7)
解析函数的实际参数从最右边开始并定向到左边
我认为你的意思是“评估”而不是“解析”。但事实并非如此,C标准没有指定订单。
因此,C标准的功能未指定。
我希望宏的相同输出为函数
不评估宏参数,只是替换它们。所以你最终得到了这个:
int i=10;
printf("%d\n", (i++) * i);
i=10;
printf("%d\n", i * (i++));
之后,您只是看到未定义的行为,正如此问题中所述:Why are these constructs (using ++) undefined behavior?。