2013-03-21 30 views
5

這是一個非常微不足道的問題: 有四個布爾函數:a(),b(),c()和d()。我想繼續打電話給他們,直到第一個返回true。而不是做傳統用短路操作替換鏈接的ifs

if(!a()) { 
    if(!b()) { 
     if(!c()) { 
      d(); 
     } 
    } 
} 

if(!a() && !b() && !c()) d(); 

我想過寫表達式作爲短路評價。

(a() || b() || c() || d()); 

但我從來沒有見過這樣的測試在C/C++代碼中以這種方式完成。這種方法有什麼問題,我錯過了?

謝謝。

+0

我可以看到*五*布爾函數。 – 2013-03-21 21:24:45

+3

@chris或不改變含義:只有在所有其他函數都是false的情況下才執行d()。 – Loghorn 2013-03-21 21:26:38

+3

我從維護角度反對這個建議。當人們看到短路版本時(如果這是你的擔憂),它可能不會立即顯現出來。事實上,你必須詢問SO的行爲應該暗示當其他人閱讀你的代碼時會發生什麼。 – Michael 2013-03-21 21:28:03

回答

3

你寫的代碼是有效的。只有在其他布爾函數返回false時纔會評估d()

然而,短路評估的可讀性較差,並且從維護的角度來看易出錯,因爲讀者可能無法理解它。

+0

它爲什麼容易出錯? – user666412 2013-03-21 21:35:39

+3

你說錯了。如果NO OTHER函數返回true,則評估d()。我猜想你的觀點是關於可讀性的。 – 2013-03-21 21:38:46

+0

謝謝本。匆忙。 – meyumer 2013-03-21 21:43:47

2

它們是等價的,但短路的評估解決方案可讀性較差,特別是如果函數名稱很長或接受參數。