c中的宏函数如何使用“按引用传递”

c中的宏函数如何使用“按引用传递”,c,C,我在学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); pr

我在学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;
}

在宏中使用参数时,参数是否充当传递引用

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;;

这也不起作用。

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;;

这也不起作用。

宏不是函数,从宏开始,编译器会在运行时用它的定义替换每次出现的宏。没有范围差异,我明白了,定义的swapa,b部分将替换为swapx,y。@StoryTeller谢谢您作为旁注,这是一个非常危险的宏,因为它容易受到运算符优先级问题的影响。我建议大家阅读一本C语言书中有关宏的内容,它会指出这个问题。宏不是一个函数,首先,宏是编译器在运行时用它的定义替换每次出现的宏。没有范围差异,我明白了,定义的swapa,b部分将替换为swapx,y。@StoryTeller谢谢您作为旁注,这是一个非常危险的宏,因为它容易受到运算符优先级问题的影响。我建议大家阅读一本C语言书中有关宏的内容,它会指出这个问题。谢谢,我有了这个概念。谢谢,我有了这个概念。