9

我最近了解到,在将一些 Java 代码转换为 C# 时,Java 的增量运算符 '+=' 隐式转换为 LHS 的类型:

int i = 5;
long lng = 0xffffffffffffL;  //larger than Int.MAX_VALUE
i += lng;                    //allowed by Java (i==4), rejected by C#

相当于:(这里有详细信息

int i = 0;
long lng = 0xffffffffffffL;
i = (int)(i + lng);

从而默默地造成损失幅度的机会。

C# 在编译时对此更加认真:
Cannot convert source type long to target type int.

Java是否允许其他类似的情况?

4

1 回答 1

4

long 可以提升为 float 或 double,这会导致准确性下降:

public static void main(String[] args) {
    float f = Long.MAX_VALUE;
    double d = Long.MAX_VALUE;

    System.out.println(Long.MAX_VALUE);
    System.out.println(f);
    System.out.println(d);

}

印刷

9223372036854775807
9.223372E18
9.223372036854776E18

不过,我怀疑 C# 也是这样做的。

除了您已经提到的复合赋值运算符之外,我相信这些都是隐式转换可以更改值的所有情况。

于 2012-12-19T16:11:50.727 回答