在这种情况下理解预处理器指令?

时间:2011-02-08 06:55:50

标签: c macros c-preprocessor

#define swap(a,b,c)(int t;t=a;a=b;b=t;);
void main()
{
    int x=10,y=20;
    swap (x,y,int);
    printf("%d %d\n",x,y);
}

输出是什么?为什么?

2 个答案:

答案 0 :(得分:6)

最好像这样重写你的宏:

#define swap(a, b, type) \
        do { \
                type t = a; \
                a = b; \
                b = t; \
        } while (0)

答案 1 :(得分:2)

基于用法以及宏中未使用c的事实,看起来宏中存在拼写错误。应该说int

,而不是使用c
#define swap(a,b,c)(c t;t=a;a=b;b=t;);

事实上,虽然这个“修复”会给你宏的一般概念,但它不会编译。请参阅Peyman's answer,它告诉您如何正确编写它。

基本上,它似乎是一种交换类型a的两个变量bc的方法。

在您的情况下,输出将是:

20 10

此交换算法的工作方式很简单。基本上,您希望将a复制到bb复制到a。但是,如果您只是将b复制到a,则会丢失a,并且您将被困在b的两个副本中。

您不必将b复制到a,而是先将a的副本保存到名为t临时变量中,然后复制b at,然后将a(其原始值b)复制到t。完成后,您可以忘记{{1}}。