昨天在用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。
解决方法也很简单,就像上面写的那样,给宏定义加上一个括号就行了,将整个宏独立起来,不再和替换后的代码拼接出现逻辑错误。
作者博客:点击打开链接