请解释这个Java布尔逻辑语句

时间:2013-07-05 08:39:27

标签: java

boolean allValid = true;
for (FormEditText field: allFields) {
    allValid = field.testValidity() && allValid;
}

我认为只有allValid每个true都是field.testValidity才是{{1}},但这种陈述是如何调用的,或者它是如何工作的?

8 个答案:

答案 0 :(得分:5)

如果且仅当field.testValidity()的所有结果都为真时,这是一种将变量设置为true的相当神秘和浪费的方法。

我更喜欢以下内容,因为它效率更高;除非由于某种原因需要在集合中的每个项目上调用testValidity()(在这种情况下,函数确实应该重命名):

boolean allValid = true;
for (FormEditText field: allFields) {
    if (!field.testValidity()){
        allValid = false;
        break;
    }
}

答案 1 :(得分:1)

你的假设是正确的。如果右侧的任一表达式评估为false,则AND&&)评估为false,并且该结果将用于 next 迭代。因此,任何false都会产生false结果。

你可能会争辩说,一旦遇到false(提供testValidity()没有副作用),你就可以突破循环,但实际上可能会以牺牲一些(可能是微不足道的)性能提升。在大多数情况下,我希望明确效率

答案 2 :(得分:0)

如果falsefield.testValidity false false AND x = false

,它将转为true

所以它们必须为true所有+初始值(此代码中为true)在循环后为{{1}}

答案 3 :(得分:0)

如果所有字段都有效,

allValid将只有true

&&行为是这样的,如果其中一个参数是false,答案将为false.

如果您有3个字段,那么正在发生的是:

allValid = field3Valid && (field2Valid && field1Valid);

因此,如果任何字段无效,则allValid将为false

如果字段2无效,则:

allValid = true && (false && true);  // ---> true && (false) ----> false

这是它的工作原理,并且如@Bathsheba的回答所指出的那样效率低下。

答案 4 :(得分:0)

在循环中,只要field.testValidity()返回true,allValid将保持为true。 只要field.testValidity()返回false,allValid就会变为false并保持为false。

这是因为假&& true = false。

答案 5 :(得分:0)

从代码中可以看出,此代码用于检查allFields变量中的所有字段是否都通过了验证。

在这种情况下,我们可以修改代码,以便如果其中一个字段无效,那么我们可以break循环。

答案 6 :(得分:0)

for (FormEditText field: allFields)表示field allFields中的field.testValidity() AND allValid预告field.testValidity()。因此,如果在任何检查中false返回allValid,则false将为{{1}}。

答案 7 :(得分:0)

正如字段名称所示,当且仅当所有表单字段都有效时, allValid 才为真,否则当它退出循环时将为false。如果表单字段中的至少一个无效,则为false。

我认为这是一个智能编写的代码,对那些不习惯布尔算术的人来说会显得神秘莫测。如果我不得不用一些解释意图的评论,我也会这样写。