2015-07-21 81 views
-5

下面是一些代碼來檢查值的範圍內短路評估一種語言漏洞?

if((i <= n) && ((i+m) >= n){ 
    //do something..... 
}; 

這基本上是一個布爾和條件,如果兩個操作數爲真,則符合條件的結果是真介於英寸 但是,對於短路評估,C++只能測試第一個條件是否爲真,如果是,則不檢查第二個條件是否爲真。 在適當的數學意義上,這是一個布爾測試?這完全deranges我的代碼的邏輯,而是我不得不寫這樣的:

if((i <= n){ 
    if((i+m) >= n){ 
     //do something...... 
    } 
} 

什麼是短路評價的意義,以及如何才能讓C++做一個適當的布爾測試,而無需使用嵌套if條件。

+2

如果是星期二,並且她正在拜訪她的父母,那麼你就會欺騙你的妻子。你每個星期二都在欺騙她嗎? –

+2

有人需要審查他們的[德摩根法律](https://en.wikipedia.org/wiki/De_Morgan%27s_laws) – CoryKramer

+0

你有第二種情況的錯字 - 應該是我+ m – cup

回答

8

但是,短路評估C++只測試第一個條件是否爲真,如果是,則不檢查第二個條件是否爲真。

這就是||的情況,但不是&&。如果第一個條件是false,則爲&&短路。你的兩個片段是相同的。

2

只是可以肯定的是,這裏沒有誤解:

(a AND b) 

將是FALSE爲b任何值,只要a是FALSE。同樣,

(a OR b) 

會爲b任何價值是真實的,只要a是TRUE。

因此,在C++中,(a && b)短路a是假,並(a || b)短路a是真的

條件通常沒有副作用。如果他們這樣做,你就可以 「聰明」,做:

if (a && do_stuff()) {} 

,而不是

if (a) { do_stuff(); } 

或者是非常愚蠢的,做

if (a && do_stuff()) { do_more_stuff(); } 

當你真正的意思做:

if (do_stuff() && a) { do_more_stuff(); } 

這就是爲什麼你不要通常有副作用的條件。它們當然是有用的和使用的。而且既然evaluation order and the short-circuiting are part of the standard,你可以放心地使用它們。

1

我覺得你是一個有點混淆短路運營商:)

  • 對於& &,如果左側表達式爲,綜合作用的結果是 (從不評估右手錶情)。
  • 對於||,如果左側表達式爲爲真,則組合結果爲爲真(右側表達式從不被評估)。

這主要是重要的,當右手錶達具有副作用,如改變的值(或調用具有副作用一些功能),例如:

如果( (ITR < 10)& &(++ ITR < n))的{

//做的東西

}

注意,合併後的條件表達式會增加itr通過1,只有對&&左側的條件表達式爲,因爲否則的話,在右側的條件表達式,即(++itr < n)永遠不會被評估。

0

當然可以!

使用布爾AND,如果a爲假,且b爲真,則(a AND b)爲假。同樣,如果a爲假並且b爲假,則(a和b)爲假。

如果C++確定左手操作數爲false,則使用AND條件,因爲整個條件爲假,所以不需要檢查第二個操作數。 因此,短路評估的好處。

2

這裏的缺陷在於你理解短路規則,而不是規則本身。對於任何有效表達式ab

if (a && b) ... 

將始終評估a。如果a爲真,則總是會評估b。短路只發生在afalse ....因爲那保證a && bfalse,而不需要評估b