快排中乙個巨集的bug

2021-08-02 22:37:10 字數 1063 閱讀 3442

今天寫快速排序,碰到乙個問題:使用了下面的巨集:

#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 #include using std::vector;

using std::cout;

using std::endl;

#define swap(a,b) \

int temp = a; \

a = b; \

b = temp

void sort(vector& v, int beg, int end)

int flag = v[beg];

int m = beg;

for (int i = beg; i<=end; ++i)

}swap(v[m], v[beg]);

sort(v, beg, m-1);

sort(v, m+1, end);

return;

}void sort(vector&v)

templateint container_print(const t &c)

return 0;

}int main()

MFC中乙個危險的Bug

上次說日本海嘯警報的時候,程式出錯。在解析 的時候,發現了mfc中的乙個bug。一。問題的產生。這個程式,用來處理日本各種天氣預報資料,包括災害的預報。如果 颱風之類的自然災害到來,程式會把預報資料進行處理,生成相應的警報資訊,並在電視上面顯示滾動的字幕來提示。程式本身,是幾年前公司的其他人寫的。裡...

MFC中乙個危險的Bug

mfc中乙個危險的bug 上次說日本海嘯警報的時候,程式出錯。在解析 的時候,發現了mfc中的乙個bug。一。問題的產生。這個程式,用來處理日本各種天氣預報資料,包括災害的預報。如果 颱風之類的自然災害到來,程式會把預報資料進行處理,生成相應的警報資訊,並在電視上面顯示滾動的字幕來提示。程式本身,是...

由框架中乙個BUG引起的

今天加班在給new guys做培訓的時候,發生了乙個莫名其妙的問題,幾經周折,才發現是公司現有框架的乙個bug。xml converter valueobject objectid lib class com.icsc.tm.mscdao.tmjcs03vo type unique converte...