C程序设计语言(K&R第二版):练习4-14

题目:

定义宏swap(t, x, y)以交换t类型的两个参数。(使用程序块结构会对你有所帮助)

自我解答:

#include <stdio.h>

#define swap(t, x, y)  t temp = x;\
                        x = y;\
                        y = temp;
#define dprint(expr)    printf(#expr " = %g\n", expr)

int main()
{
    double i = 3, j = 4;
    dprint(i);
    dprint(j);
    swap(double, i, j);
    dprint(i);
    dprint(j);
    return 0;
}

运行结果

i = 3
j = 4
i = 4
j = 3

本题使用了dprint宏进行了调试,确实很方便

参考答案:

#define swap(t, x, y) {  t _z;     \
                         _z = y;   \
                         y = x;    \
                         x = _z;   } 

我们利用花括号定义了一个新的程序块。程序块允许我们在它的开头部分对在该语句块内使用的局部变量作出声明。为了交换两个参数的值,我们生命了一个类型为t的局部变量_z。

上面这个swap宏只有在两个参数名都不是_z的前提下才能工作。如果两个参数名之一是_z,如:

swap(int, _z, x);

那么,这个宏在展开时就会成为

{int _z; _z = _z; _z = x; x = _z;}

从而导致两个参数的值无法交换。所以,我们写的两个swap宏是以_z不会被用作变量名为假设前提的。

总结:

在自我解答中没有使用程序块,这会导致一个严重的问题,即不能在一个函数中多次使用swap宏,因为会重复定义相同的变量temp.

另外正如参考答案中所指出的那样,两个参数名都不能和temp重合,所以对于这个变量的定义应该比较独特一些,使用_开头的变量名会更好一点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值