评估尊重括号和优先权 - java

时间:2015-07-12 01:56:58

标签: java

根据Java语言规范:

评估尊重括号和优先顺序

除了使用数学运算之外:

$scope.input={
  field1:''
}

此规则是否适用于其他任何示例?我尝试使用

int i = 3;
int j =  3 * (9 + 3);
System.out.println(j); //results to 36

但结果是i:1和z:0。似乎对该示例的评估仍然是从左到右。

3 个答案:

答案 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;哪个运算符?争论第一?如果+具有更高的优先级,它会在*之前获取它附近的参数,可以这么说;结果是bc被添加,结果乘以a。也就是说,它等同于

a * (b + c)

但在大多数编程语言中(有一些例外情况,例如APL),*具有更高的优先级。这意味着参数在*绑定之前绑定到+,这意味着ab成倍增加,并将结果添加到c {1}},即

(a * b) + c

同样,在表达式

a + b * c

结果是bc相乘,结果会添加到a

a + (b * c)

您可以在表达式的某些部分周围加上括号来更改参数的绑定方式;因此,如果您想添加ab并将总和乘以c,您可以说

(a + b) * c

但需要注意的是:所有这些都控制了如何在编译时解释表达式。 但是在运行时,参数总是从左到右进行评估。 当程序运行时,所有上述表达式都会导致程序评估a,然后{ {1}},然后是b如果cab是变量,这并不重要,但如果它们是方法电话,它可能很重要。在Java中,当程序运行时,事物总是从左到右进行评估。 (其他语言并非如此;我所知道的大多数语言都让编译器选择顺序。)

当谈到c||(或其他一些语言中的类似运算符)时,再一次在运行时,左边的参数首先是始终。可能会或可能不会评估正确的参数。括号和运算符优先级控制表达式的解释方式,如果你有一个像&&这样的表达式,但它们在运行时改变评估的顺序。

答案 2 :(得分:1)

只要测试可以被评估为true或false,执行就会在if块内跳转。在您的情况下,i等于0,其比5轻,因此测试评估为true

(true OR a OR b)ab的值无关,未评估(并且未应用增量)。

(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);