2016-04-26 23 views
1

我讀this教程斯坦福大學的,他們說:壞括號

常見的編碼錯誤:

在宏定義

#define min(a, b) a<b?a:b // incorrect 
#define min(a, b) (((a)<(b))?(a):(b)) // correct 

我甚至在跑這個壞括號一個程序,它運行良好。

有人可以解釋他們想說什麼!

+1

兩種形式都不好。正確的做法是int min(int a,int b){return a Lundin

+1

你必須考慮宏不是函數,它們實際上只是替換你定義的文本,所以如果你打算在更復雜的情況下使用它們,正如有人已經指出的那樣,你可能會發現一些問題 –

+0

可能重複[在C中宏需要括號(https://stackoverflow.com/questions/10820340/the-need-for-parentheses-in-macros-in-c) –

回答

5

第一個版本出現故障,如果你與其他運營商結合起來:

min(a , b) + c 

,並轉換爲:

a<b?a:b+c 

這是相同的:

a<b?a:(b+c) 

這是一個意外給出第一個括號的結果。

第二個版本沒有太大的改進。如果函數或i++傳遞給宏,它會評估其中一個參數兩次,這可能會導致意外的行爲。

應使用內聯函數來代替這些宏。

+2

「它會對參數中的一個進行兩次評估,這可能會導致未定義的行爲「不,這是不正確的這個具體情況。在第一個和第二個或第三個操作數的評估之間有一個順序點。 – Lundin

+0

未經處理的行爲,如果我通過++,是因爲三元運算符在那裏,對嗎?或者它必須用宏做些什麼..? –

+0

@GauravArora不,這是因爲函數式的宏一般是不安全和非常糟糕的做法。 – Lundin