以下代码符合输出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;
???
答案 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中详细了解表达式评估。