java - Java 运算符优先级到底是如何工作的?

标签 java operator-precedence

我想问一些简单的事情。

我提供了一个非常简单的计算示例,但我收到的结果与我的预期不同。 有人可以解释一下我哪一步做错了吗?

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其优先级低于加法运算符,加法运算符的优先级低于乘法运算符,乘法运算符的优先级低于递增/递减运算符。另请注意,变量是从左到右计算的,无论它们之间的运算符的优先级如何。

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 的表达式时犯了错误。

关于java - Java 运算符优先级到底是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55939596/

相关文章:

java - 创建一种通过网络发送整数的有效方法。传输控制协议(protocol)

java - log4j隐藏jar文件的名称

python - 为什么 "**"绑定(bind)比否定更紧密?

java - Java 是如何评价这个语句的呢?

java - 令人困惑的返回声明

java - 如何在Java中过滤嵌套的Map<String, Object>?

java - Android:应用程序重新启动时下载的文件被删除

java - 从 SharedPreference 添加 Cookie 到 Android 应用程序中的 Cookie 管理器

c++ - C++函数调用中参数括号()的结合性

c - 程序输出说明