为啥这个 if 语句没有失败? [复制]

Posted

技术标签:

【中文标题】为啥这个 if 语句没有失败? [复制]【英文标题】:Why doesn't this if statement fail? [duplicate]为什么这个 if 语句没有失败? [复制] 【发布时间】:2017-01-26 11:54:24 【问题描述】:

这段代码不应该产生被零除的异常吗?

public class Testing 
    public static void main(String[] args) 
        if(6 > 5 || 5 / 0 == 0)
            System.out.println("true");
    

根据precedence rules,5 / 0 不会在6 > 5 之前执行,所以我的印象是这段代码会因为被零除异常而失败。

我知道 java 会短路 if 语句。因此,如果第一个为真,那么它将评估为真,甚至不检查第二个。

但是,这些优先规则看起来像是 5 / 0 会先被执行?

【问题讨论】:

另见***.com/questions/6800590/… "根据优先规则,5 / 0 不会在 6 > 5 之前执行" 哪个优先规则让你这么认为? if 语句从左到右计算 没有。事实上,您的第二个测试是死代码(因为六总是大于五)。您可以通过交换测试的顺序来验证这一点。此外,单个| 会按照您的预期工作,因为它不会短路(它仍然从左到右评估)。 if (6 > 5 | 5 / 0 == 0) 【参考方案1】:

不,不应该。评估逻辑运算符的第一侧以进行短路。 If 语句从左到右求值。在您的示例中,首先评估 6 > 5,因为它位于逻辑运算符的左侧。这是真的,所以不检查下一个条件。现在如果你使用|操作符,它不会短路:

if(6 > 5 | 5 / 0 == 0)  ... 

这将抛出一个ArithmeticException,因为双方都被评估了。

【讨论】:

以上是关于为啥这个 if 语句没有失败? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 if 语句忽略命令行参数? [复制]

为啥这个正则表达式替换语句没有做任何事情? [复制]

为啥在 if 语句中初始化字符串似乎与在 switch 语句中不同? [复制]

为啥 Map 在这个例子中有一个 return 语句? [复制]

为啥这个 if 语句在这种情况下不起作用? [关闭]

为啥 Microsoft 的 C/C++ 编译器允许使用逗号分隔表达式的 if 语句? [复制]