我想问一个简单的问题。
我提供了一个非常简单的计算示例,得出的结果与我的预期不同。 有人可以解释我做错了哪一步吗?
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
}
答案 0 :(得分:1)
bit-shift operators的优先级低于加法运算符,加法运算符的优先级低于乘法运算符,乘法运算符的优先级低于增量/减量运算符。另外请注意,无论变量之间的运算符优先级如何,变量都是从左到右求值的。
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
的表达式求值时,您似乎犯了错误。