如果第一个为假,则一个 if 语句中的两个条件是不是第二个重要?

Posted

技术标签:

【中文标题】如果第一个为假,则一个 if 语句中的两个条件是不是第二个重要?【英文标题】:Two conditions in one if statement does the second matter if the first is false?如果第一个为假,则一个 if 语句中的两个条件是否第二个重要? 【发布时间】:2013-05-12 10:38:35 【问题描述】:

好的,所以我测试了这段代码,我发现没有抛出任何异常。

public static void main(String[] args) 
    int[] list = 1,2;
    if (list.length>2 && list[3] == 2)
        System.out.println(list[1]);
    

这里是不是声明

if (list.length>2 && list[3] == 2)

意味着如果第一个条件为假,我们甚至不必检查第二个条件?

或者等于

if (list.length>2)
    if (list[3] == 2)
        ...
    

?

而且,如果它是用 C 或 python 或其他一些语言编写的呢?

谢谢

【问题讨论】:

你的两种方式是等价的 Java 遵循en.wikipedia.org/wiki/Short-circuit_evaluation(短路评估)来验证该表达式 短路评估让您评估只有在第一个条件合法时才合法的条件。你会经常看到类似if(string != null && string.length > 5)的代码 @RicardoCacheira 实际上它们完全不同。看第一个答案。 【参考方案1】:

是的。如果不满足第一个条件,则不评估其余条件。这被称为短路。有关详细信息,请参阅here。请注意,这并不是 Java 特有的,许多其他语言也会这样做。

【讨论】:

【参考方案2】:

是的,两种用法在语义上是等价的…… 也就是说,除非长度 > 2,否则代码是否允许访问超过第 2 个元素。

在第一种情况下,重要的是&& 运算符,可以将其视为: 如果第一个条件为真然后应用第二个条件。

后面的条件也有一个隐含的“then”子句

if length greater than two
 then access third element

【讨论】:

【参考方案3】:

对于语言(其中包括 Java 和 Python)来说,评估逻辑 AND 的第一个参数并在第一个参数是 false 时完成语句的评估是很常见的。这是因为:

来自The Order of Evaluation of Logic Operators,

当 Java 计算表达式 d = b && c; 时,它首先检查 b 是否为真。这里b是假的,所以不管c是真还是假,b && c都一定是假的,所以Java不会费心去检查c的值。

这称为short-circuit evaluation,在Java docs 中也有提及。

查看list.count > 0 && list[0] == "Something" 来检查列表元素是否存在是很常见的。


另外值得一提的是if (list.length>2 && list[3] == 2)等于第二种情况

if (list.length>2)
    if (list[3] == 2)
        ...
    

如果之后有elseelse 将仅适用于它所附加的 if 语句。

为了演示这个问题:

if (x.kind.equals("Human")) 
    if (x.name.equals("Jordan")) 
        System.out.println("Hello Jordan!");
    
 else 
    System.out.println("You are not a human!");

会按预期工作,但是

if (x.kind.equals("Human") && x.name.equals("Jordan")) 
    System.out.println("Hello Jordan!");
 else 
    System.out.println("You are not a human!");

还会告诉任何不是Jordan的人类他们不是人类。

【讨论】:

最后一个区块是公平的。只有Jordans 才能统治世界。 Python 的位运算符(&,|支持短路。然而,Python 的以下运算符 doandoranyall【参考方案4】:

来自 javadoc:

条件运算符

&& 和 ||运算符执行条件与和条件或 对两个布尔表达式的操作。这些运营商展示 “短路”行为,这意味着第二个操作数是 仅在需要时进行评估。

&& 条件与 ||条件或

【讨论】:

完美答案!加一个短路概念!【参考方案5】:

如果第一个条件为假,那么它不会检查第二个条件 && F =F 再次取决于您正在执行的位操作。 就像在 OR (||) 的情况下,如果第一个条件为真 (T),它不会将第二个条件作为任何东西来检查 || T = T 但如果它是假的 (F) 那么它肯定会检查第二个

【讨论】:

【参考方案6】:

您已在 IF 语句中指定要执行 System.out.println 的两个条件都应为真。因此,如果第一个条件本身失败,则不检查第二个条件(这是用于 AND 运算符)。但是如果您在 If 语句中指定了 OR 运算符,则将检查第二个条件。

【讨论】:

【参考方案7】:

它不会读取完整的表达式,因为在表达式的完整计算之前结果是明确的,并且结果被返回

【讨论】:

以上是关于如果第一个为假,则一个 if 语句中的两个条件是不是第二个重要?的主要内容,如果未能解决你的问题,请参考以下文章

如果第一个条件为假,假设 if-and 语句总是会中断是不是安全? [复制]

Python中的循环和if语句

IF 语句:如果条件为假,如何将单元格留空(“”不起作用)

shell编程二条件判断

条件语句示例

条件选择