快排中一个宏的bug
来源:互联网 发布:linux sshd服务是什么 编辑:程序博客网 时间:2024/06/07 03:05
今天写快速排序,碰到一个问题:使用了下面的宏:
#define SWAP(a,b) \ int temp = a; \ a = b; \ b = temp
咋看没有问题,但是在使用时a,不是一个值而是一个表达式
SWAP(v[++m], v[i]);
这样在编译器预处理的时候会展开为
int temp = v[++m]; v[++m] = v[i]; v[i] = temp;m被加了两次,导致错误。
对于宏的使用,如果不打算改变宏参数的值,可以在宏开始的地方,保存一边宏的值,避免重复计算,例如
#define MAX(a,b) \ a > b? a: b
如果传入的a,b时fa().fb(),那么至少有一个函数计算了两次,导致额外的计算。
完整的代码如下
#include <vector>#include <iostream>using std::vector;using std::cout;using std::endl;#define SWAP(a,b) \ int temp = a; \ a = b; \ b = tempvoid sort(vector<int> & v, int beg, int end) { if (beg >= end) { return; } int flag = v[beg]; int m = beg; for (int i = beg; i<=end; ++i) { if (v[i] < flag) { ++m; SWAP(v[m], v[i]); } } SWAP(v[m], v[beg]); sort(v, beg, m-1); sort(v, m+1, end); return;}void sort(vector<int> &v) { int size = v.size(); sort(v, 0, size - 1);}template<class T>int container_print(const T &c) { typename T::const_iterator beg = c.begin(); typename T::const_iterator end = c.end(); for (;beg != end; ++beg) { cout << *beg << ","; } return 0;}int main() { vector<int> v; v.push_back(10); v.push_back(20); v.push_back(-20); v.push_back(-30); v.push_back(-50); v.push_back(50); v.push_back(-10); v.push_back(-9); v.push_back(-8); v.push_back(-7); container_print(v); cout << endl; sort(v); container_print(v); cout << endl;}
阅读全文
0 0
- 快排中一个宏的bug
- 快排中一个宏的bug
- 微软的一个bug?
- OracleParameter 的一个bug
- FireFox的一个bug
- 微软的一个BUG
- Tencent 的一个Bug
- 一个ComboBox的Bug
- WindowsXP的一个Bug
- QQ的一个BUG
- JCreator的一个BUG
- Word2007的一个bug
- hibernate3的一个bug
- ICTCLAS的一个bug
- CMonthCalCtrl的一个BUG
- Delphi2007的一个Bug?
- VS2005的一个BUG
- VC005的一个BUG
- CSS position: absolute 绝对定位精讲
- 84. Largest Rectangle in Histogram
- Handler总结
- LPC 简单程序
- linux /usr /var /etc 目录
- 快排中一个宏的bug
- 在vs2010中的qt工程新加的图片无法显示
- 机房重构总结--界面与功能篇
- Binary Tree Paths
- 深入理解CSS中的层叠上下文和层叠顺序
- 通过python编写定时任务压缩日志文件
- iOS 键盘限制输入内容限制、输入长度限制
- 在StoryBoard/Xib 中复用Xib 并实时预览
- JQuery checkbox操作