根据Java语言规范:
评估尊重括号和优先顺序
除了使用数学运算之外:
$scope.input={
field1:''
}
此规则是否适用于其他任何示例?我尝试使用
int i = 3;
int j = 3 * (9 + 3);
System.out.println(j); //results to 36
但结果是i:1和z:0。似乎对该示例的评估仍然是从左到右。
答案 0 :(得分:5)
使用||
,Java在评估表达式时使用短路概念。因此,在此:
if(i++ < 5 || (++z <0 && 5 > z++) || 6 < ++i){
因为第一个表达式i++ < 5
返回true,因此表达式的其余部分将不会被评估,即从未被访问过,因此只会在i
的值中进行更改而不会发生任何其他事情。
来自Java Docs的引用:
条件运算符 和&amp;&amp;和||运算符对两个布尔表达式执行条件AND和条件OR运算。这些操作员表现出短路&#34;行为,这意味着仅在需要时才评估第二个操作数。 &安培;&安培;有条件-AND ||有条件-OR 以下程序ConditionalDemo1测试这些运算符:
class ConditionalDemo1 {
public static void main(String[] args){
int value1 = 1;
int value2 = 2;
if((value1 == 1) && (value2 == 2))
System.out.println("value1 is 1 AND value2 is 2");
if((value1 == 1) || (value2 == 1))
System.out.println("value1 is 1 OR value2 is 1");
}
}
答案 1 :(得分:2)
括号和优先级与 order 无关,其中表达式在运行时进行评估。也就是说,如果您认为在表达式周围加上括号意味着它将更早得到评估,或者更早地评估优先级的运算符,那么您就会误解这个概念。
运算符优先级回答如下问题:在表达式
中a * b + c
编译器&#34;绑定&#34;哪个运算符?争论第一?如果+
具有更高的优先级,它会在*
之前获取它附近的参数,可以这么说;结果是b
和c
被添加,结果乘以a
。也就是说,它等同于
a * (b + c)
但在大多数编程语言中(有一些例外情况,例如APL),*
具有更高的优先级。这意味着参数在*
绑定之前绑定到+
,这意味着a
和b
成倍增加,并将结果添加到c
{1}},即
(a * b) + c
同样,在表达式
中a + b * c
结果是b
和c
相乘,结果会添加到a
。
a + (b * c)
您可以在表达式的某些部分周围加上括号来更改参数的绑定方式;因此,如果您想添加a
和b
并将总和乘以c
,您可以说
(a + b) * c
但需要注意的是:所有这些都控制了如何在编译时解释表达式。 但是在运行时,参数总是从左到右进行评估。 当程序运行时,所有上述表达式都会导致程序评估a
,然后{ {1}},然后是b
。如果c
,a
和b
是变量,这并不重要,但如果它们是方法电话,它可能很重要。在Java中,当程序运行时,事物总是从左到右进行评估。 (其他语言并非如此;我所知道的大多数语言都让编译器选择顺序。)
当谈到c
和||
(或其他一些语言中的类似运算符)时,再一次在运行时,左边的参数首先是始终。可能会或可能不会评估正确的参数。括号和运算符优先级控制表达式的解释方式,如果你有一个像&&
这样的表达式,但它们不在运行时改变评估的顺序。
答案 2 :(得分:1)
只要测试可以被评估为true或false,执行就会在if块内跳转。在您的情况下,i
等于0
,其比5
轻,因此测试评估为true
。
(true OR a OR b)
与a
和b
的值无关,未评估(并且未应用增量)。
与(false AND a AND b)
相同,但它总是会跳过该块。
检查表达式的顺序,将它们分成单独的测试或从测试中获得增量。以下代码等同于您的示例,但具有您期望的输出:
int i = 0;
int z = 1;
if(i < 5 || (z < 0 && 5 > z+2) || 6 < i+2){
System.out.println("Routed here");
}
i += 2;
z += 2;
System.out.println("i: " + i);
System.out.println("z: " + z);