Java运算符优先复合体(后缀,一元,关系,逻辑AND,赋值)

时间:2016-10-26 08:25:15

标签: java operators operator-precedence

以下代码符合输出b1=false

int x=1;
boolean b1 = ++x >= 1 && x++ == 1;
System.out.println("b1="+b1);

但根据Java Operator Precedence Table,它必须输出 b1=true

任何人都可以一步一步地向我解释会发生什么?

根据Java Operator Precedence Table用于此问题的运算符的顺序是,

1>后缀 - x++

2 - ;一元 - ++x

3>关系 - >=

4>平等 - ==

5个逻辑AND - &&

我使用的方法,

1> ++x >= 1 && x++ == 1

2 - ; ++x >= 1 && 1 == 1现在x=2

3> 3 >= 1 && 1 == 1现在x=3

4> true && 1 == 1

5个true && true

6个true

因此它应该输出b1=true

我哪里出错?

我问的很简单,我们认为运算符优先级高于表达式的评估顺序,int x=1+2*3; 为什么要使用评估顺序 ++x >= 1 && x++ == 1; ???

的运算符优先级

1 个答案:

答案 0 :(得分:3)

您不应该混淆运营商优先级和评估顺序。无论运算符优先级如何,表达式都从左到右进行评估。

第1步:通过对子表达式进行分组,将运算符优先级应用于您的表达式:

boolean b1 = ++x >= 1 && x++ == 1;
//becomes
boolean b1 = ( ((++x) >= 1) && ((x++) == 1) );

第2步:无论运算符优先级如何,都会从左到右对子表达式进行评估:++x因此在x++之前进行评估。

但请注意,x++仅在条件的左侧部分为真时进行评估,否则&&返回false而不评估第二个条件。

换句话说,您的代码相当于:

int x = 1;
int temp1 = ++x; //temp1 = 2
boolean b1 = false;
if (temp1 >= 1) {
  int temp2 = x++; //temp2 = 2
  if (temp2 == 1) {
    b1 = true;
  }
}

参考:您可以在JLS #15中详细了解表达式评估。