问题描述
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中。值得注意的是:
- 这是介绍性描述性文本,而不是规范性文本。
- 在这种情况下,它并没有确切说明“算术”运算符的含义。
- 相反,它并不是说数字提升不适用于(可以说)不是“算术”运算符的其他运算符。
如果您继续阅读5.6.1和5.6.2部分,则会发现一元和二进制数值促销适用的运算符。
请注意,以上内容适用于JLS版本5和11。到JLS 14为止,它们已将5.6.1和5.6.2节折叠到5.6节中。措词已更改(删除了您认为矛盾的文本)。 (仍然)列出了所有相关的运算符。
(这是编辑整理,不是实际语言语义的变化。)