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




