2013-07-03 43 views
1

我有兩個條件,ShouldCheckForErrorsHasErrors如何正確跳過步驟2個,如果條件爲真

我的代碼是

if(ShouldCheckForErrors && HasErrors) 
{ 
    //Do nothing 
} 
else 
{ 
    PassTest() 
} 

我覺得這是一個非常冗長的檢查。沒有辦法可以在不必使用else的情況下執行單一檢查?

例如:

if(!ShouldCheckForErrors && !HasErrors) 
{ 
    PassTest() 
} 

不起作用,因爲這將無法調用PassTest()ShouldCheckforErrorstrue,但HasErrorsfalse。 (反之亦然)

我只是覺得我忘了我的邏輯操作符。

回答

8

您正在尋找De Morgan's Law

if (!ShouldCheckForErrors || !HasErrors) 

換一種說法:

你應該通過其中如果沒有錯誤,或者如果我們不檢查錯誤。

+0

根據第一個代碼(這是「更長」),通過意味着*兩個*都是真的,這不是*或*,而是*和*。 – Tigran

+0

@Tigran:這不是如何否定的作品。 http://en.wikipedia.org/wiki/De_Morgan%27s_laws – SLaks

+0

這是一個好方法。現在我不知道如何@Adil答案編譯到,但我認爲這兩個條件都檢查在哪裏,如果'!ShouldCheckForErrors'評估爲'真'''HasErrors'不會被檢查 –

5

使用非運營商!後,你得到的這兩個條件的結果

if(!(ShouldCheckForErrors && HasErrors)) 
{ 
    PassTest(); 
} 
+0

我貼+1 – SpaceghostAli

+1

很乾淨之前沒有看到這一點,但我決定去與''以防止不必要的調用第二個條件(ShouldCheckForErrors || HasErrors!) 。 – JHixson

2

你的邏輯是有點過

!ShouldCheckForErrors && !HasErrors 

是不一樣的

!(ShouldCheckForErrors && HasErrors) 

這是什麼我相信你想要

1

簡單的情況 -

if(theOnlyCheck) { 

} 
else { 
    do(); 
} 

你似乎是足夠精明,縮短這個檢查 -

if(!theOnlyCheck) { 
    do(); 
} 

但你只是弄亂你的操作順序。對於theOnlyCheck,代替(check1 && check2)。不要忘了括號:

if(!(check1 && check2)) { 
    do(); 
} 

現在,如果你不喜歡處理這些括號,你可以按照德·摩根定律:!(a && b)是一樣的!a || !b。認爲它通過自己看 -

if(!check1 || !check2) { 
    do(); 
}