如果我理解正确的话,在你的问题的第一部分,你问是否a
和b
必须都为真,整个表达式(a && b || c || d || e)
评估为真.
这个问题的答案是否定的.Java运算符的&&
优先级高于||
.所以等价的表达式是:
(a && b) || c || d || e
因此,如果任何a && b
或c
或d
或e
为真,则整个表达式将评估为真.例如,如果a
为false且c
为真,则整个表达式为真.
注意Java条件运算符短路.这意味着一旦表达式的最终结果已知,评估就会停止.例如,如果a
和b
都是真实的,这意味着整个表达式的值必须为真,那么c
,d
并且e
不被评估.
对于问题的第二部分,我们可以应用相同的逻辑.因此,等效表达式为:
(a && b) || (a && c) || (a && d) || (a && e)
如果有任何子组件,这将评估为真,例如.a && c
评估为真.正如其他人所指出的那样,a
表达式必须是真实的,因为它是每个子组件的一部分.然后,如果任何其他变量为true,则表达式为true.
一旦你理解了这一点,就可以看到@ Arc676建议的这个表达式的简化是如何实现的:
a && (b || c || d || e)
我还应该补充一点,你问题中的两个表达式在逻辑上是不同的.它们相当于:
(a && b) || c || d || e
和
a && (b || c || d || e)
括号影响评估顺序.在第一个中,a
并且b
由a组合在一起&&
,因此对于表达式的该部分(在括号中)都必须为真.在第二个,b
,c
,d
和e
通过分组在一起||
.在这种情况下,只有一个b
,c
,d
和e
需要为表达的那部分(括号)真正是真实的.
如果我理解正确的话,在你的问题的第一部分,你问是否a
和b
必须都为真,整个表达式(a && b || c || d || e)
评估为真.
这个问题的答案是否定的.Java运算符的&&
优先级高于||
.所以等价的表达式是:
(a && b) || c || d || e
因此,如果任何a && b
或c
或d
或e
为真,则整个表达式将评估为真.例如,如果a
为false且c
为真,则整个表达式为真.
注意Java条件运算符短路.这意味着一旦表达式的最终结果已知,评估就会停止.例如,如果a
和b
都是真实的,这意味着整个表达式的值必须为真,那么c
,d
并且e
不被评估.
对于问题的第二部分,我们可以应用相同的逻辑.因此,等效表达式为:
(a && b) || (a && c) || (a && d) || (a && e)
如果有任何子组件,这将评估为真,例如.a && c
评估为真.正如其他人所指出的那样,a
表达式必须是真实的,因为它是每个子组件的一部分.然后,如果任何其他变量为true,则表达式为true.
一旦你理解了这一点,就可以看到@ Arc676建议的这个表达式的简化是如何实现的:
a && (b || c || d || e)
我还应该补充一点,你问题中的两个表达式在逻辑上是不同的.它们相当于:
(a && b) || c || d || e
和
a && (b || c || d || e)
括号影响评估顺序.在第一个中,a
并且b
由a组合在一起&&
,因此对于表达式的该部分(在括号中)都必须为真.在第二个,b
,c
,d
和e
通过分组在一起||
.在这种情况下,只有一个b
,c
,d
和e
需要为表达的那部分(括号)真正是真实的.