宏是危险的

请预测下面代码运行输出什么?
#include <stdio.h>
#define MAX(a, b) ((a) > (b) ? (a) : (b))
int main(int argc, char **argv)
{
int a = 4, b = 4;
printf("%d", MAX(++a, b));
return 0;
}

 

 
答案是5 ? 错!!!!!
看预处理后的代码吧。
int main(int argc, char **argv)
{
 int a = 4, b = 4;
 printf("%d", ((++a) > (b) ? (++a) : (b)));
 return 0;
}

 

所以答案是6!!
纠结了吧!!!!!
改成这样, 或许可以和宏一样的效率, 却比宏更安全。。。
#include <cstdio>
template<typename T>
inline T MAX(const T a, const T b)
{
return a > b ? a : b;
}

int main(int argc, char **argv)
{
int a = 4, b = 4;
printf("%d\n", MAX(++a, b));
return 0;
}
posted @ 2013-04-19 13:14  int32bit  阅读(70)  评论(0)    收藏  举报