2016-04-28 27 views
0

我在代碼中看到了邏輯和比較操作,我覺得它可以被簡化。如何確保兩個邏輯和比較操作相等?

簡單地說,它看起來像:

if (!a || !(b || c)) {...} 

但我認爲這是一樣

if (!a || !b || !c) {...} 

我應該如何在這種情況下怎麼辦?我想我可以在現有的代碼中看到更多這樣的操作。除了手動檢查外,是否有規則來簡化/優化這種操作?

+0

有趣的鏈接:[德摩根法](https://en.wikipedia.org/wiki/De_Morgan's_laws) – DenseCrab

+0

https://en.wikipedia.org/wiki/De_Morgan's_laws您的轉型應該引入了'&&'某處:「不(A或B)」與「(不是A)和(不是B)」相同。 – Thilo

回答

1

您可以申請DeMorgan's law獲得:

if (!a || (!b && !c)) {...} 

其中,由於具有比||更高的優先級&&,是一樣的:

if (!a || !b && !c) {...} 

不過是整個環境顯得非常不利,並閱讀正面條件幾乎總是比較容易,可能寫得更好:

// This is the negation of your condition after applying DeMorgan's law 
if (a && (b || c)) { 
    // return or throw error 
} 

... // What you would've done in the if statement 
0

問題是如果!(b || c)我們和!b ||一樣!C。 嘗試一個簡單的道理表:

b c !(b||c) !b||!c 
0 0 1   1 
0 1 0   1 
1 0 0   1 
1 1 0   0 

因此,他們是不一樣的。

0

對於接近這種類型的布爾重構的,如果你不相信自己的能力,構建真值表一般的技術,怎麼樣沿着這些線路寫一些代碼:

for a in {true, false} 
    for b in {true, false} 
    for c in {true, false} 
     if (!a || !(b || c)) <> (!a || !b || !c) 
     then exit with message "Not equivalent" 
    end 
    end 
end 

if條件可當然可以用您試圖測試的任何兩個表達式替換。