Java运算符优先级复合体(后缀、一元、关系、逻辑和、赋值)
以下代码符合输出Java运算符优先级复合体(后缀、一元、关系、逻辑和、赋值),java,operators,operator-precedence,Java,Operators,Operator Precedence,以下代码符合输出b1=false int x=1; boolean b1 = ++x >= 1 && x++ == 1; System.out.println("b1="+b1); 但根据标准,它必须输出b1=true 谁能一步一步地给我解释一下发生了什么事吗? 用于此问题的运算符的顺序根据 1> 后缀-x++ 2> 一元-++x 3> 关系-= 4> 相等-== 5> 逻辑与-& 我使用的方法, 1> ++x>=1&&x++==1 2> ++x>=1&&1==1现在x=
b1=false
int x=1;
boolean b1 = ++x >= 1 && x++ == 1;
System.out.println("b1="+b1);
但根据标准,它必须输出b1=true
谁能一步一步地给我解释一下发生了什么事吗?
用于此问题的运算符的顺序根据
1> 后缀-x++
2> 一元-++x
3> 关系-=
4> 相等-==
5> 逻辑与-&
我使用的方法,
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:通过分组子表达式,将运算符优先级应用于表达式:
boolean b1 = ++x >= 1 && x++ == 1;
//becomes
boolean b1 = ( ((++x) >= 1) && ((x++) == 1) );
步骤2:然后从左到右对子表达式求值,而不考虑运算符优先级:++x
因此在x++
之前求值
但是请注意,x++
仅在条件的左半部分为true时计算,否则&&
返回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;
}
}
参考:您可以在中阅读有关表达式计算的更多信息。运算符优先级和计算顺序是两件不同的事情。首先计算&&
的左侧。(通常情况下,首先计算事物的左侧。)该代码不是等价的-即用于&
,而不是&
。编辑;请随意回滚。非常好的一点,谢谢。好的,谢谢,但你能告诉我另一个例子,表达式从左到右求值,然后应用运算符优先级吗?(不使用逻辑运算符)说:x=1;y=x+++++x代码>-在这种情况下,y将是1+3=4。无论如何,x++(后缀)的优先级高于+++x(一元运算符或前缀)