我在代碼中看到了邏輯和比較操作,我覺得它可以被簡化。如何確保兩個邏輯和比較操作相等?
簡單地說,它看起來像:
if (!a || !(b || c)) {...}
但我認爲這是一樣
if (!a || !b || !c) {...}
我應該如何在這種情況下怎麼辦?我想我可以在現有的代碼中看到更多這樣的操作。除了手動檢查外,是否有規則來簡化/優化這種操作?
我在代碼中看到了邏輯和比較操作,我覺得它可以被簡化。如何確保兩個邏輯和比較操作相等?
簡單地說,它看起來像:
if (!a || !(b || c)) {...}
但我認爲這是一樣
if (!a || !b || !c) {...}
我應該如何在這種情況下怎麼辦?我想我可以在現有的代碼中看到更多這樣的操作。除了手動檢查外,是否有規則來簡化/優化這種操作?
您可以申請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
問題是如果!(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
因此,他們是不一樣的。
對於接近這種類型的布爾重構的,如果你不相信自己的能力,構建真值表一般的技術,怎麼樣沿着這些線路寫一些代碼:
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
條件可當然可以用您試圖測試的任何兩個表達式替換。
有趣的鏈接:[德摩根法](https://en.wikipedia.org/wiki/De_Morgan's_laws) – DenseCrab
https://en.wikipedia.org/wiki/De_Morgan's_laws您的轉型應該引入了'&&'某處:「不(A或B)」與「(不是A)和(不是B)」相同。 – Thilo