[英]Simplify if condition boolean expression
我的代码中有这个if-condition
:
if (a||a&&!b){
// do some stuff
}
使用我的junit test
中的初始值:
boolean a=true, b = true;
正如我后来认识到的,该语句可以简化为:
if (a&&b)
变成绿色: Assert.assertTrue(a||a&&!b == a&&b);
有没有进一步的简化? 我怎么知道这个布尔表达式可以简化?
只需检查真值表(我已添加括号)
a || (a && (!b))
a|b|result
----------
T|T|T
T|F|T
F|T|F
F|F|F
正如我们所见,公式不依赖于b
,可以简化为仅
a
最后
if (a) {
// do some stuff
}
对于具有许多变量的公式,当真值表太长而无法手动分析时,您可以使用 Eomm 建议的卡诺图。
一种用于简化复杂布尔表达式的常用技术是卡诺图。 它相对容易学习,并且可以帮助您生成更短的表达式,甚至可以从真值表构建布尔表达式。
您的表达式的卡诺图非常简单 - 它看起来像这样:
它简化为a
,而不是a && b
。
您可以使用卡诺图来简化布尔逻辑。
使用3个或更多变量是最好的方法
a || a && !b
不等于
a && b
它等于只是a
。
我想在您的 JUnit 测试中,您使用了a
和b
值的特定组合,结果匹配,但这并不意味着表达式是等效的——事实上它们不是。 一种快速说服自己的方法是检查组合
a = true, b = false;
您的原始表达清楚得到true
所有情况下, a == true
,但你的第二个表达式将产生false
每当b == false
。
至于等价的,只是一个形式证明a
,采取扩张
a == a && (b || !b)
== a && b || a && !b
插入您的原始表达式:
a || a && !b == a && b || a && !b || a && !b
== a && b || a && !b
== a
Wolfram Alpha实际上做了布尔代数简化。 它可能需要一点点转换它给你的答案,使它与你的编程语言兼容,但这个概念有效并且检查得很好。 这是该页面的链接
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.