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中,有这样的保证吗?或者我需要同时执行这些测试以确定吗?
答案 0 :(得分:5)
是。来自JLS section 15.24:
条件或运算符
||
运算符类似于|
(第15.22.2节),但仅当其左侧操作数的值为false时才计算其右侧操作数。
除非左手操作数为真,否则甚至不会评估右手操作数这一事实意味着它有从左到右进行评估......但事实上, 所有运算符就属于这种情况。来自JLS 15.7:
Java编程语言保证运算符的操作数似乎以特定的评估顺序进行评估,即从左到右。
方法(和构造函数)参数也是如此。例如,从第15.12.4.2节(评估参数,方法调用的运行时评估的一部分):
参数表达式(如果有)按从左到右的顺序进行评估。如果任何参数表达式的求值突然完成,那么其右边的任何参数表达式的任何部分都不会被评估,并且由于同样的原因,方法调用突然完成。
(有趣的是注意到“似乎”在这里 - JVM实际上无序地评估它们是可以的,只要这不是可观察的......)
答案 1 :(得分:4)
||
,&&'的顺序是从左到右。
对于||
运营商。如果它看到a||b
,如果a
是false
,则会检查b
。
答案 2 :(得分:2)
如果左侧是||
,true
运算符将short circuit。左侧是始终首先评估。
是的,保证此代码是安全的:如果foo
为null
,则永远不会抛出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中实际上没有很好地指定)来应用。所以当然乘法发生在加法之前。