#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。
解决方法也很简单,就像上面写的那样,给宏定义加上一个括号就行了,将整个宏独立起来,不再和替换后的代码拼接出现逻辑错误。
作者博客:点击打开链接
- #define的使用注意
- #define 的注意用法
- typedef与#define的使用时注意点
- #define的一些注意点
- 【C++】define的用法注意
- define的作用,指针特别注意
- #define声明时需要注意的事情
- #define的使用总结
- define的使用技巧
- define的使用技巧
- define的使用
- #define的错误使用
- #define 中 #/##的使用
- #define 的使用
- #define的使用
- #define的使用
- C# 定义常量 注意:C#不能使用 #define
- C++中define的使用
- Linux 环境下的内核态与用户态
- 国际化软件测试内容解析
- 字体边框的光晕效果
- DFB使用
- 学习 信息资源管理第一章
- #define的使用注意
- EBS预置文件设置以及系统之间的移植
- Linux下常用文件系统
- UTF-8 and Unicode FAQ
- Posix多线程编程学习笔记(二)—线程属性(1)
- Comparator and Comparable 及Collections and Collection 的区别及联系
- Linq 中按照多个值进行分组(GroupBy
- 如何正确的完全卸载MySQL
- 继续保留希腊对于欧元区意义深远