数字促销仅适用于算术运算符吗?

问题描述

JLS指出数字提升适用于算术运算符的操作数。

数字提升应用于算术运算符的操作数。 数字促销上下文允许使用: 身份转换(第5.1.1节) 不断扩大的原始转换(第5.1.2节) 取消装箱转换(第5.1.8节)

但是,根据我的经验,我发现数值提升也适用于其他运算符(如按位运算符)的操作数。我发现this指出

当使用乘法运算符(%,*,/),加法运算符(+,-),比较运算符(, =),相等运算符(==,!= )和整数按位运算符(&,|,^)。

那么我想念什么吗?

编辑:未列出的其他运算符,如&&,||,>>,>>等如何?

编辑2:如@ Turing85和@Stephen C所指出,此问题仅对JLS 5至11有效,并且现已解决。

解决方法

Binary numeric promotion (JLS 5.6.2)适用于“某些二进制运算符”的操作数,其中包括按位运算符&,^和|。引用:

二进制数值提升是对某些运算符的操作数执行的:

  • 乘法运算符*,/和%(第15.17节)
  • 数字类型+和-(§15.18.2)的加减运算符
  • 数值比较运算符和> =(§15.20.1)
  • 数值相等运算符==和!=(§15.21.1)
  • 整数按位运算符&,^和| (§15.22.1)
  • 在某些情况下,条件运算符? :(§15.25)

对于&&和||,它们是布尔值的运算符,并且存在数字提升。

位移运算符>><<>>>遵循不同的规则:unary numeric promotion分别应用于操作数,表达式的类型仅由左侧操作数。这意味着以下代码有效:

int i =1;
long l = 2;
int j = i << l;
,

找到的文本显示在JLS section 5.6中。值得注意的是:

  1. 这是介绍性描述性文本,而不是规范性文本。
  2. 在这种情况下,它并没有确切说明“算术”运算符的含义。
  3. 相反,它并不是说数字提升不适用于(可以说)不是“算术”运算符的其他运算符。

如果您继续阅读5.6.15.6.2部分,则会发现一元和二进制数值促销适用的运算符。

请注意,以上内容适用于JLS版本5和11。到JLS 14为止,它们已将5.6.1和5.6.2节折叠到5.6节中。措词已更改(删除了您认为矛盾的文本)。 (仍然)列出了所有相关的运算符。

(这是编辑整理,不是实际语言语义的变化。)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...