#define的使用注意

来源:互联网 发布:淘宝账户怎么注册 编辑:程序博客网 时间:2024/05/19 09:01

昨天在用C++写一个程序的时候,用到了

#defineMAX(a,b)   a>b?a:b

很显然,这个宏定义了语句,用于求取a、b之间的最大值,通常来说这应该比单独写一个函数来得高效(函数调用需要压栈出栈的操作)。这样的语句我以前用过多次,应该没什么问题的。但是,我在程序中有这样一段代码:

int a =Height(p->left);int b =Height(p->right);p->height =MAX(a,b)+1;

经过调试,发现每次运行到这,MAX返回的值总是错误的。化简来说就是这样:

int a = 0;int b = -1;int c =MAX(a,b)+1;

照理来说,此时c应该是1,而现在的c却是0.

为什么会这样呢?当时纠结了一下,后来突然醒悟,这是宏定义的问题。我把宏定义改成这样:

#defineMAX(a,b)  (a>b?a:b)

修改之后的宏定义,完全能正常工作。

原因如下:

宏定义其实就是一个替换的过程,在代码被编译的时候,编译器会把所有MAX出现的地方替换为我定义的语句。也就是说,以上的三条语句,将会被替换成如下的语句:

int a = 0;int b = -1;int c = a>b?a:b+1;

可以看到,此时比较的是确实是a和b,但是返回却是a和b+1,此时a=0,b=-1,取的是冒号前的表达式,即a。所以返回值一直都是0,而不是1。

解决方法也很简单,就像上面写的那样,给宏定义加上一个括号就行了,将整个宏独立起来,不再和替换后的代码拼接出现逻辑错误。

 作者博客:点击打开链接

原创粉丝点击