【问题标题】:Java int += double syntax surprise [duplicate]Java int +=双重语法惊喜[重复]
【发布时间】:2013-03-21 22:07:26
【问题描述】:

我遇到了以下令人惊讶的线路:

int x = 7;
x += 0.5;

显然是合法的语法!添加之后,x 仍然是 7,所以 double 被强制转换为 int 并向下舍入为 0,但这是在代码中没有任何显式强制转换的情况下完成的。其他人对此感到惊讶吗?这里的理由是什么?

编辑以澄清我的问题:谁能给出这个决定的充分理由?要求在其他任何地方进行显式强制转换,这让我觉得这是一个糟糕的决定,但是在语言中有一个地方可以让你默默地丢弃数据。我错过了什么吗?

【问题讨论】:

  • 有趣。我确信JLS 解决了这个问题。你有没有看它说什么?
  • @Hovercraft:JLS 给出了规范,但没有给出决定的理由,这就是我要问的。

标签: java syntax operators int


【解决方案1】:

x += 0.5;x = (int) (x + 0.5); 相同。

【讨论】:

    【解决方案2】:
    x += 0.5;
    

    相当于:

    x = (int) (x + 0.5)
    

    一般:

    x += y 等价于x = (type of x) (x + y)


    15.26.2. Compound Assignment Operators

    【讨论】:

    • 我明白这一点。令我惊讶的是编译器允许它!在您的第二行中,有一个明确的演员表,这迫使程序员认识到他们可能会丢失一些信息。例如,x = x + .5 无法编译,但 x += .5 可以……奇怪,不是吗?
    • @EricLindauer 一点也不奇怪,x + 0.5 产生一个双精度数,而 (int) (x + 0.5) 是一个整数。
    • 我想我不是很清楚......我知道规范说这就是它的工作原理。我的问题是:为什么?谁能证明允许 x += .5,但不允许 x = x + .5?!这对我来说似乎很疯狂。
    • @EricLindauer 只是 int a = 0.5; 无效,而 int a = (int) 0.5 有效。
    • 我认为@EricLindauer 的意思是,应该是:x += 0.5 应该等同于 x = (x + 0.5) 并且不要添加 (int) 的部分,因为它会导致静默丢失精度。
    【解决方案3】:

    这是因为复合赋值运算符会进行隐式转换(自动转换): 所以

    x+=0.5 => x =(int)(x + 0.5) => x = (int)(7.5) => x = 7
    

    【讨论】:

    • 这样做有充分的理由吗?
    • @EricLindauer:如果xshort,即使y 也是,如果没有明确的类型转换,像x = x + y; 这样的语句将是非法的。因此,Java 的行为就好像任何复合算术赋值运算符计算的结果都被显式类型转换为结果类型,无论它在任何特定情况下是否有意义。
    猜你喜欢
    • 2014-02-16
    • 2021-04-11
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    相关资源
    最近更新 更多