You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Java中100% - 40的运算机制及编译器解析步骤咨询

嘿,这个问题问到点子上了!很多人第一次看到这种写法都会懵——为啥双目运算符%能跟减号凑一起?其实核心是这里的减号不是你以为的双目减法运算符,而是一元负号运算符!下面我给你掰扯清楚整个逻辑和编译器的解析步骤:

核心:Java运算符的优先级规则

在Java的运算符优先级里,一元运算符(包括负号-、正号+、取反!等)的优先级要高于所有双目算术运算符(比如%*/+-。所以当编译器看到100% - 40时,不会把它当成(100% ) - 40(这显然语法错误),而是会把-40当成一个完整的负整数常量来处理。

编译器解析System.out.println(100% - 40);的具体步骤

我把整个过程拆成一步步的:

  • 第一步:识别语句结构。编译器首先认出这是一个System.out.println()的方法调用,需要处理括号里的参数表达式100% - 40
  • 第二步:扫描表达式中的元素。它会看到四个元素:常量100、取模运算符%、负号-、常量40
  • 第三步:按优先级处理运算符。因为一元负号-优先级更高,所以先把-40结合,计算出-40——这是一个合法的int类型负常量。
  • 第四步:转换为合法的双目取模运算。现在表达式就变成了100 % (-40),这时候%作为双目运算符,左右都有了合法的操作数:左操作数100,右操作数-40
  • 第五步:执行取模运算。Java里取模结果的符号和左操作数保持一致,计算逻辑遵循公式:被除数 = 除数 × 商 + 余数。这里100 = (-40) × (-2) + 20,所以余数是20
  • 第六步:输出结果。把计算得到的20传入println方法,最终控制台就会输出20
额外验证小技巧

你可以自己写两行代码测试:

System.out.println(100% -40);
System.out.println(100 % (-40));

运行后会发现两行输出都是20,这就直接证明了编译器确实把-40当成了一个整体的负操作数,而不是把%-当成两个连续的双目运算符来处理。

内容的提问来源于stack exchange,提问作者Sunil Garg

火山引擎 最新活动