条件 OR 运算符(||)的短路行为

Posted

技术标签:

【中文标题】条件 OR 运算符(||)的短路行为【英文标题】:short-circuiting behavior of conditional OR operator(||) 【发布时间】:2012-04-27 05:49:40 【问题描述】:

条件运算符 && 和 ||根据http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html 短路,这意味着有时不需要计算第二个操作数。

谁能提供一个条件OR(||)运算符会短路的例子吗?

条件与(&&)运算符的短路行为非常简单,如下所示:

if(false && (1 > 0)) 那么第二个操作数:(1 >0) 不需要评估,但似乎无法找到/想到条件或的示例。

【问题讨论】:

当第一个操作数的结果可以定义逻辑运算的结果时,就会发生短路。对于&&,第一个变为false 肯定会产生结果false,而对于||,第一个变为真将肯定产生结果true。因此,true 的第一个操作数将始终为 || 运算符短路。 为什么使用 || 不那么直接?它和 && 一样简单。当整个条件的值已知时,表达式的计算将停止。表达式从左到右计算。 @MichaelSchmeißer:抱歉,不知道我是怎么错过它的直截了当的。 【参考方案1】:

当第一个操作数为真时,or 运算符短路。所以,

String foo = null;
if (true || foo.equals("")) 
    // ...

不会抛出NullPointerException

正如@prajeesh 在 cmets 中正确指出的那样,在实际代码中使用短路的方式是在处理可能返回 null 的 API 时防止NullPointerException。因此,例如,如果有一个 readStringFromConsole 方法返回当前可用的字符串,如果用户没有输入任何内容,则返回 null,我们可以编写

String username = readStringFromConsole();
while (username == null || username.length() == 0) 
    // No NullPointerException on the while clause because the length() call
    // will only be made if username is not null

    System.out.println("Please enter a non-blank name");
    username = readStringFromConsole();


// Now do something useful with username, which is non-null and of nonzero length

附带说明,只要用户不键入任何内容,返回用户输入的 API 就应该返回空字符串,并且不应返回 null。返回 null 是一种表示“没有可用的内容”的方式,而返回空字符串是一种表示“用户没有输入任何内容”的方式,因此是首选。

【讨论】:

我没有遇到这种特定的true || foo.equals("") 使事情看起来合乎逻辑的情况,它应该是if(foo==null || foo.equals("")),当foo 为空时会短路,从而防止NPE。【参考方案2】:
if(true || (0 > 1))

第一个陈述是正确的,因此没有必要评估第二个。

【讨论】:

【参考方案3】:
if (true || comparison)

比较永远不会被评估,因为它的结果是无关紧要的(因为第一个参数已经是真的)。​​

【讨论】:

以上是关于条件 OR 运算符(||)的短路行为的主要内容,如果未能解决你的问题,请参考以下文章

python学习30300509逻辑运算短路原则

python学习30300509逻辑运算短路原则

java入门---运算符&逻辑运算符&短路逻辑运算符&赋值运算符&条件运算符&instanceof 运算符

Java 逻辑运算符

三元运算符是不是以定义的方式短路

Java逻辑运算符