2012-09-17 30 views
2

在這一行的短路和可讀性

if ((last_search == NULL) || (last_search != NULL && total_results != 0))

我知道,C'S短路計算規則說,只有當last_search不爲空將它嘗試和評價||的右側,因此它等同於寫

if ((last_search == NULL) || (total_results != 0))

,我被告知使用後有人,但還不是前者更具可讀性?編譯器也不會優化出多餘的last_search != NULL

+0

不,是的。代碼越少越好。 –

+0

注意:我寧願移動到左邊,'(NULL == last_search)...', – a1ex07

+0

@ a1ex07我知道這只是個人偏好(我知道我最近看到了這種趨勢),但對我來說,不斷的在左邊讓閱讀變得更加困難。我讀到「如果NULL等於...」,這是錯誤的,因爲NULL是一個常數,不會改變。 「如果last_search等於...」對我來說是一種更加自然和可理解的讀物。 – twalberg

回答

10

這是主觀的,但不是,第一個變體不是更具可讀性,因爲還有更多可讀的。最可讀的代碼(和最少的錯誤!)是不存在的代碼。想一想如果你想一次檢查3或4個條件會發生什麼。

這裏是另一個反例:你會寫這樣的代碼嗎?

if (number < 0) { 
} 
else if(number >= 0) { 
    // why not just "else"? 
} 

至於性能:編譯器可能會優化冗餘調用,但撤消性能下降不會有助於降低可讀性。

+1

+1。如果我想強調'number> = 0'(例如在一個非常長的if塊之後),我將elseif的if部分移動到註釋中。 – Bergi

5

不,它不是。第二個是更可讀。無論編譯器是否將其優化掉,爲什麼還要在其中保留冗餘校驗?

第一個版本告訴你last_search不是NULL,因爲它到了那裏,但如果你不能告訴從第一條件(last_search == NULL失敗),你可能已經得到了比可讀性更大的問題。

+0

爲你+1,因爲這個答案是一樣好Jon的但你沒有得到讚揚,因爲他有更多的代表... – 2012-09-17 15:34:56

+1

@ H2CO3是公平的,我也贊成他的「最可讀的代碼是不存在的。」。 :) –

+0

@ H2CO3:等到你看到當你回答一個問題時會發生什麼,Jon Skeet也是這樣做的。順便說一句,我也贊成這個,因爲Luchian是第一個。 – Jon

1

這不僅是短路評估,它使得它不可讀,而且使用多餘的比較的事實。

if (!last_search || total_results) 

比您提議的任何東西都容易閱讀。

+0

這個問題是如果'NULL'的值不是'false'? 'NULL'只是一個常量(我希望它是 - 無論如何 - 如果不是這樣,這裏會出現更多的問題),因此可能實際上對應於不會被評估爲錯誤的東西。使用「if((last_search == NULL)|| total_results)」 – AJMansfield

+0

@AJMansfield NULL將始終評估爲false。即使其底層表示不全爲零。 – Dave

+0

指針值轉換以獲得邏輯條件由標準定義。它的確如你所期望的那樣:當指針是一個空指針時它是'false'。只需使用標準提供的工具即可。 –