2016-01-20 121 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

相关问题