首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >验证真值表的最小检查次数

验证真值表的最小检查次数
EN

Stack Overflow用户
提问于 2010-11-01 06:42:15
回答 3查看 393关注 0票数 1

我有一个java程序,我想验证3个布尔值中是否有任何一个是假的。我想要找出我可以编写的最小表达式,以检查排列。

if(!(needsWork && (needsApproval || isAdmin) ))

我认为这足以确保如果3个布尔值中有任何一个是假的,我希望停止处理。然而,我暗自怀疑我遗漏了什么。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-01 06:47:42

if (!needsWork || !needsApproval || !isAdmin)不能工作吗?Java支持短路评估。

票数 7
EN

Stack Overflow用户

发布于 2010-11-01 08:05:40

因为

代码语言:javascript
运行
复制
`any 3 booleans are false` (i.e. `!a || !b || !c`)

代码语言:javascript
运行
复制
`(! (needsWork && (needsApproval || isAdmin))` (i.e. (! (a && ( b || c))`

有不同的真值表,你确定不同的情况不重要吗?

代码语言:javascript
运行
复制
a b c   (!a || !b || !c)    (! (a && (b || c)))
T T T          F                    F          
T T F          T                    F
T F T          T                    F
T F F          T                    T
F T T          T                    T
F T F          T                    T
F F T          T                    T
F F F          T                    T

Transformations

我经常尝试使用布尔表达式来澄清或简化它们,我使用这些逻辑转换来帮助我:

代码语言:javascript
运行
复制
// You can push (distribute) `!` into parenthesis if you reverse the `||` or `&&` operator inside:
! (a || b)             <=> (! a && ! b)
! (a || b || c || ...) <=> (! a && ! b && ! c && ...)

! (a && b)             <=> (! a || ! b)
! (a && b && c && ...) <=> (! a || ! b || ! c || ...)

// You can drop parens when the boolean operator outside the parens is the same as inside:
(a || (b || c || ...)) <=> (a || b || c)
(a && (b && c && ...)) <=> (a && b && c)

// You can push (distribute) a boolean op into parenthesis by applying it to each term inside:
(a || (b && c)         <=> ((a || b) && (a || c)
(a || (b && c && ...)  <=> ((a || b) && (a || c) && (a || ...) ...

(a && (b || c)         <=> ((a && b) || (a && c))
(a && (b || c || ...)  <=> ((a && b) || (a && c) || (a || ...) ...

// XOR means the term values have to be different:
(a ^ b)                <=> ((a && !b) || (!a && b))

// XOR means the same as OR unless both terms are true:
(a ^ b)                <=> ((a || b) && ! (a && b))

当然还有很多其他的,但这些是我最常使用的。它可能看起来很复杂,但一旦你开始练习它们,就很容易记住它们。

在您的例子中,如果您想了解一些可能的等价语句:

代码语言:javascript
运行
复制
(! (needsWork && (needsApproval || isAdmin) ))

以下是一些转换:

代码语言:javascript
运行
复制
(! (needsWork && (needsApproval || isAdmin) ))   => [push the '!' through the `()`]
(! needsWork || ! (needsApproval || isAdmin) )   => [push the 2nd '!' through the `()`]
(! needsWork || (! needsApproval && ! isAdmin))

但我看不到你所拥有的东西有任何真正的简化。

当然,如果检查any of 3 booleans are false是否正常,那么您的选择就很简单

代码语言:javascript
运行
复制
(! needsWork || ! needsApproval || ! isAdmin) => [or pull the `!` outside the `()`]
(! (needsWork  && needsApproval && isAdmin))
票数 6
EN

Stack Overflow用户

发布于 2010-11-01 06:47:24

代码语言:javascript
运行
复制
if(!(needsWork & needsApproval & isAdmin))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4065539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档