2015-06-29 75 views
2

1.Imagine condition if (obj.is_x() || obj.is_y() || obj.is_z())
如果obj.is_x()返回true,將調用obj.is_y()obj.is_z()嗎?是否優化了條件評估?這段代碼不好?

2.這是一個壞主意(一般)?這段代碼看起來不好嗎?

bool isbn13_prefix_valid (const string& prefix) 
{ 
    unsigned num = stoi(prefix); 
    if (num == 978 || num == 979) return 1; //super common ones 
     else if ( num >= 0 && num <= 5 || num == 7 || num >= 600 && num <= 649 
       || num >= 80 && num <= 94 || num >= 950 && num <= 989 
       || num >= 9900 && num <= 9989 || num >= 99900 && num <= 99999) 
      return 1; 
    return 0; 
} 
+0

您應該至少使用這些值的符號常量。那麼你應該考慮將每個條件重構爲一個具有自解釋名稱的單一方法。 –

+0

'if(num == 978 || num == 979)return 1; //超級普通的 else if'擺脫其他,這是多餘的。最後一個條件與'num == 999'相同。 –

+1

容易出錯,難以理解,沒有直觀的意義,太長。 –

回答

7
  1. 沒有,也不會因short-circuiting

  2. 是的,該代碼看起來不好。不是因爲它不正確,而是因爲你將一個非常長的條件填入單個if聲明中。嘗試重構你的代碼,使其更清潔。

1

你的代碼是絕對好的。我希望看到這些奇怪數字來自哪裏的評論,就這些。

把它變成十幾個微不足道的功能是沒有任何幫助的。它實際上使得閱讀代碼變得更加困難,因爲它遍佈許多許多代碼行。是的,這很複雜。但是,這是由於問題很複雜,試圖將複雜性分散出去並沒有一點幫助。

您的實際問題: b,首先評估a。如果它是真的,那麼b不被評估並且結果是真實的。如果a爲假,那麼b也會被評估,結果是真或假,這取決於b的結果。

優化編譯器可能在b完成評估之前開始評估b,如果它能證明b的評估沒有副作用,並且它認爲(主要是由於硬件中的並行性)它平均儘快並行評估儘可能快,即使有些事情在沒有必要時進行評估。但是這在代碼的結果中並不明顯,只會使代碼更快。