2016-01-20 118 views
1

有沒有更好的方法來檢查x && (!y || (y && z))是否爲真? 我想我可以爲此創建一個功能並執行諸如x && not_or_and(y, z)之類的操作來減輕一些痛苦。但是,這是我能做的嗎?如何簡化x &&(!y ||(y && z))

+2

簡化這個規則是:'x || (y && z)==(x || y)&&(x || z)'請參閱:https://en.wikipedia.org/wiki/Boolean_algebra –

+4

嘗試繪製真值表。 – Dan

回答

11

忽略了表達的副作用,這在邏輯上等同

x && (!y || z) 

額外檢查你在做(y && z)y是多餘的,因爲如果你去的地方,你需要檢查點部分表達式,你已經確定!y是假的,這意味着y是真實的。

+0

考慮到副作用,是不是因爲可能的編譯器優化而不可預知?我想任何好的編譯器都會優化它。 –

+0

@SergeyTachenov:我不確定你想說什麼。但是我暗示的(當我說「忽略副作用」時),可能是'x','y'和'z'不是簡單的布爾。例如,它們可以是返回布爾的函數調用。這些功能可能有副作用。例如,如果'x'爲真,並且'y'是返回'true'的函數調用,那麼'y'將在OP代碼中被調用兩次,但在我的代碼中只會調用一次。 –

+0

@Sergey,如果標記'y'是一個返回bool的函數調用,那麼該函數可能在原始表達式中調用過兩次,而不會在「優化」版本中調用兩次。只要沒有&&和||的操作符重載,這兩種表達式評估都是可預測的。因此,當在令牌y中調用函數兩次而不是一次時可能會有副作用。 – franji1

相關問題