快排中一个宏的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;}