Java 运算符优先级是如何工作的?
How Java Operator Precedence exactly work?
我想问个简单的问题。
我提供了一个非常简单的计算示例,我收到的结果与我的预期不同。
谁能解释一下我哪一步做错了?
public static void main(String[] args) {
int x =1;
int y = 101;
int a = 2;
int z = ++y + y * a << 3 *2 * ++x + (x+=2);
/*
Step 1 int z = ++y + y * a << 3 *2 * ++x + (3);
Step 2 int z = 102 + 102 * 2 << 3 *2 * 4 + (3);
Step 3 int z = 102 + 204 << 24 + (3);
Step 4 int z = 306 << 27;
Expected:41,070,624,768
*/
System.out.println(z);
//Actual: 20,054,016
}
bit-shift operators 的优先级低于加法运算符,加法运算符的优先级低于乘法运算符,乘法运算符的优先级低于 increment/decrement 运算符。另请注意,无论变量之间运算符的优先级如何,变量都是从左到右求值的。
int z = ++y + y * a << 3 *2 * ++x + (x+=2);
首先,做增量。
102 + 102 * 2 << 3 * 2 * 2 + 4
接下来,做乘法。
102 + 204 << 12 + 4
然后做加法。
306 << 16
移位导致 20054016
。
看起来你在计算最右边带有 x
的表达式时出错了。
我想问个简单的问题。
我提供了一个非常简单的计算示例,我收到的结果与我的预期不同。 谁能解释一下我哪一步做错了?
public static void main(String[] args) {
int x =1;
int y = 101;
int a = 2;
int z = ++y + y * a << 3 *2 * ++x + (x+=2);
/*
Step 1 int z = ++y + y * a << 3 *2 * ++x + (3);
Step 2 int z = 102 + 102 * 2 << 3 *2 * 4 + (3);
Step 3 int z = 102 + 204 << 24 + (3);
Step 4 int z = 306 << 27;
Expected:41,070,624,768
*/
System.out.println(z);
//Actual: 20,054,016
}
bit-shift operators 的优先级低于加法运算符,加法运算符的优先级低于乘法运算符,乘法运算符的优先级低于 increment/decrement 运算符。另请注意,无论变量之间运算符的优先级如何,变量都是从左到右求值的。
int z = ++y + y * a << 3 *2 * ++x + (x+=2);
首先,做增量。
102 + 102 * 2 << 3 * 2 * 2 + 4
接下来,做乘法。
102 + 204 << 12 + 4
然后做加法。
306 << 16
移位导致 20054016
。
看起来你在计算最右边带有 x
的表达式时出错了。