【问题标题】:Numeric promotion only for arithmetic operators?数字提升仅适用于算术运算符?
【发布时间】:2020-12-04 11:27:30
【问题描述】:

JLS 声明数字提升应用于算术运算符的操作数。

数值提升应用于算术运算符的操作数。 数字提升上下文允许使用: 身份转换(§5.1.1) 扩大的原始转换(§5.1.2) 拆箱转换 (§5.1.8)

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

当使用乘法运算符(%、*、/)、加法运算符(+、-)、比较运算符(、=)、相等运算符(==、!=)时,可能会发生这些转换) 和整数位运算符(&、|、^)。

所以我错过了什么?

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

编辑2:正如@Turing85 和@Stephen C 所指出的,这个问题只对JLS 5 到11 有效,现在已经解决了。

【问题讨论】:

标签: java type-conversion jls type-promotion


【解决方案1】:

您找到的文本出现在 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 节中。措辞已更改(删除您认为矛盾的文本)。相关运算符都(仍然)列出。

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

【讨论】:

    【解决方案2】:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-30
      相关资源
      最近更新 更多