【问题标题】:Java += compiler/jre bug? [duplicate]Java += 编译器/jre 错误? [复制]
【发布时间】:2013-06-07 02:56:39
【问题描述】:

我在使用 java += 运算符时遇到了一些意外。

显然,这是编译:

int a = 0;
a += 3/2.0;
System.out.println(a);  // outputs "1"

虽然没有

int a = 0;
a = a + (3/2.0);   // eclipse compiler error "Type mismatch: cannot convert from double to int"
System.out.println(a);

这是预期的行为吗?我觉得奇怪的是 += 运算符没有报告“类型不匹配”,因为它是一个“添加和分配”运算符,您在其中添加一个双精度数,它给出双精度结果,然后分配给一个 int 变量。相反,它会默默地转换(并截断)结果。

【问题讨论】:

  • 看看@这个answer和这个too
  • 我应该从那里剪切和粘贴答案,这样我的代表就会飞升 ;-)
  • 如果 gosling 读到这个问题,那么他会做 FACEPALMS :P,他称之为 java 中的错误,哈哈

标签: java


【解决方案1】:

这就是 += 从 C 开始的工作方式。这是“功能”而不是错误

Java's +=, -=, *=, /= compound assignment operators

顺便说一句,你可以试试这个

char ch = '0';
ch *= 1.1; // ch = '4'

另见我的帖子http://vanillajava.blogspot.com/2012/11/java-and-implicit-casting.html

【讨论】:

  • C 毫无怨言地在赋值中进行了缩小转换,所以这不是 C 的遗留问题,这是在使 Java 比 C 和 C++ 更严格时做出的妥协。
  • answer
  • @R.J 很好发现,但有时记忆力不太好;)
  • 当 Java 设计人员将简单的 int d=1.3 视为编译器错误而不仅仅是警告时,当 int a+=3/2.0 是等效的 sin 时,将其设为可编译的合理性有多大?
  • @pinkpanther 我认为这是一个不一致的地方,因为他们使赋值更加严格,但也许假设如果你使用赋值运算符你知道你在做什么。鉴于 C 允许隐式转换,他们可能没想到这是个问题。
【解决方案2】:

int a = a + (3/2.0); 无法编译,因为:

  • int + double 导致double
  • a 被引用为 int
  • double 转换为 int 缺失

int a += 3/2.0; 编译自:

  • int + double 导致双重
  • a 被引用为 int
  • double 可转换为 int,幸运的是,编译器添加了类似于以下内容的隐式转换:

    int a = (int)(a+ 3/2.0);。这是由于特殊的 op= 表示法比基本赋值运算符更能从编译器中解释:=

【讨论】:

    【解决方案3】:

    这不是错误,它发生了隐式转换。

    例如。

    Byte b=3;
    
    b+=5;  //compiles
    
    b=b+5; //doesnt compiles
    

    这里发生了什么

    a=a+3/2.0;   // 3/2.0 produces double , it add int to double but cant convert it implicitly to int.
    
    a += 3/2.0;  // here implicit conversion after addition of a to 3/2.0 happends from double to int
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 2011-03-08
      相关资源
      最近更新 更多