2011-02-08 65 views
-3
#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

哪里在您的宏使用`C`? – Peyman 2011-02-08 07:01:27

+1

你的代码不能编译,但你不清楚你的问题是什么。 – 2011-02-08 08:06:06

回答

2

根据的使用情况以及c未在宏中使用的事实,它看起来好像在宏中存在拼写错误。除了使用int的,应该说c

#define swap(a,b,c)(c t;t=a;a=b;b=t;); 

事实上,当这个“修复”会给你的宏观的总体思路,它不会编译。请参阅Peyman's answer,告诉您如何正确书写。

基本上,它看起来像一种交换c类型的两个变量a,b的方法。

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

20 10 

这种交换算法的工作方式很简单。基本上,你想复制abba。但是,如果您将b复制到a,则会丢失a,并且您将被扣两份b

而不是仅仅复制ba,你先救的a拷贝到一个名为t一个临时变量,然后复制到ba,然后复制t(持有的a原始值)为b。当你完成后,你可以忘记t

+0

不能将语句放在括号中或在表达式中声明变量。宏需要更多的工作。 – 2011-02-08 07:12:10

6

更好地重新写你的宏是这样的:

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