所有评估都是从左到右进行的吗?

时间:2013-06-11 22:12:46

标签: java

String foo = null;

if(foo == null || foo.equals("")){
    //this is only safe if I'm guaranteed that the evaluation happens from left to right
}

在Java中,有这样的保证吗?或者我需要同时执行这些测试以确定吗?

6 个答案:

答案 0 :(得分:5)

是。来自JLS section 15.24

  

条件或运算符||运算符类似于|(第15.22.2节),但仅当其左侧操作数的值为false时才计算其右侧操作数。

除非左手操作数为真,否则甚至不会评估右手操作数这一事实意味着它从左到右进行评估......但事实上, 所有运算符就属于这种情况。来自JLS 15.7

  

Java编程语言保证运算符的操作数似乎以特定的评估顺序进行评估,即从左到右。

方法(和构造函数)参数也是如此。例如,从第15.12.4.2节(评估参数,方法调用的运行时评估的一部分):

  

参数表达式(如果有)按从左到右的顺序进行评估。如果任何参数表达式的求值突然完成,那么其右边的任何参数表达式的任何部分都不会被评估,并且由于同样的原因,方法调用突然完成。

(有趣的是注意到“似乎”在这里 - JVM实际上无序地评估它们是可以的,只要这不是可观察的......)

答案 1 :(得分:4)

||,&&'的顺序是从左到右。

对于||运营商。如果它看到a||b,如果afalse,则会检查b

答案 2 :(得分:2)

如果左侧是||true运算符将short circuit。左侧是始终首先评估。

是的,保证此代码是安全的:如果foonull,则永远不会抛出NullPointerException


仅供参考,您的代码片段是java代码的典型代码,是最佳实践。

答案 3 :(得分:1)

是的,java会使用OR运算符从左到右短路条件。

  

在运行时,首先计算左侧操作数表达式;如果   结果具有类型布尔值,它将进行拆箱转换   (§5.1.8)。

     

如果结果值为true,则为条件的值或   表达式为true,右侧操作数表达式不为   评价。

     

如果左侧操作数的值为false,则为右侧   表达式被评估;如果结果是布尔类型,则为   进行拆箱转换(§5.1.8)。结果值变为   条件或表达式的值。

答案 4 :(得分:0)

答案是 IT DEPENDS

在您的情况下 - 是,但一般来说这取决于运营商。

例如 =(指定运营商)评估是从从右到左执行

int a = 1;
int b = 2;
int c = 3;

a = b = c;

System.out.println("a = " + a);
System.out.println("b = " + b);
System.out.println("c = " + c);

结果:

a = 3
b = 3
c = 3

在这里,您可以找到Java运算符的完整列表和评估顺序:http://introcs.cs.princeton.edu/java/11precedence/

答案 5 :(得分:0)

你的头衔有误导性。根据JLS,您的实际问题的答案是“是”,但“从左到右进行的所有评估”绝对不是真的。

这是一种常见的误解。考虑表达式a+b*c。 JLS实际上关于评估顺序的内容是从左到右评估运算符的操作数。因此a,b,c按此顺序进行评估,无论它们是什么,例如功能。 运算符根据指定的运算符优先级(在JLS中实际上没有很好地指定)来应用。所以当然乘法发生在加法之前。