我'在c学习宏, 我在宏中编写了一个小函数来交换数字,但是将值传递给'传递值'因为我没有在参数中的变量之前使用运算符(&)的地址,但是当我运行程序时。价值得到了转变。您可以参考代码并提及我理解错误的地方吗?
#include<stdio.h>
#include<conio.h>
#define swap(a,b) a = a+b;b = a-b; a = a-b;
int main()
{
int x = 5, y = 10;
swap(x,y);
printf("%d %d\n",x,y);
getch();
return 0;
}
在宏中使用时,参数是否作为参考传递?
答案 0 :(得分:3)
C没有传递引用。而这不是这里发生的事情。当“调用”宏时,预处理器用正文替换呼叫站点。
使用您的示例,调用
swap(x,y);
替换为
x = x+y;y = x-y; x = x-y;;
最后一行是编译器的实际解析器。
许多编译器都有在预处理步骤后停止的选项。我建议您使用它来确切了解预处理器的功能。
我也希望你能开始看到宏如何“破坏”你的代码。
例如,如果代码是
if (some_condition)
swap(x,y);
然后它将扩展(通过一些重新格式化)
if (some_condition)
x = x+y;
y = x-y;
x = x-y;
;
这显然不是预期的,也不会起作用。
当宏的参数不是简单变量而是表达式时,您也会遇到这种情况。像
swap(x+1,y*2)
虽然会被
取代x+1 = x+1+y*2;y*2 = x+1-y*2; x+1 = x+1-y*2;;
这也行不通。