直到今天,我还以为:
i += j;
只是一条捷径:
i = i + j;
但如果我们这样做:
int i = 5;
long j = 8;
则i=i+j;不会编译,但i+=j;将编译良好。
这是否意味着实际上i+=j;是这样的捷径吗i=(i的类型)(i+j)?
直到今天,我还以为:
i += j;
只是一条捷径:
i = i + j;
但如果我们这样做:
int i = 5;
long j = 8;
则i=i+j;不会编译,但i+=j;将编译良好。
这是否意味着实际上i+=j;是这样的捷径吗i=(i的类型)(i+j)?
当前回答
在Java中,当赋值操作右侧的表达式类型可以安全地升级为赋值左侧的变量类型时,自动执行类型转换。因此,我们可以安全地分配:
byte -> short -> int -> long -> float -> double.
反之亦然。例如,我们不能自动将long转换为int,因为第一个比第二个需要更多的存储空间,因此信息可能会丢失。为了强制进行这样的转换,我们必须执行显式转换。类型-转换
其他回答
在i=i+l的情况下,需要显式地从long转换为int,然后它将编译并给出正确的输出。喜欢
i = i + (int)l;
or
i = (int)((long)i + l); // this is what happens in case of += , dont need (long) casting since upper casting is done implicitly.
但在+=的情况下,它工作得很好,因为运算符隐式执行从右变量类型到左变量类型的类型转换,因此不需要显式转换。
Yes,
基本上当我们写作时
i += l;
编译器将其转换为
i = (int)(i + l);
我刚检查了.class文件代码。
知道这真是件好事
在Java中,当赋值操作右侧的表达式类型可以安全地升级为赋值左侧的变量类型时,自动执行类型转换。因此,我们可以安全地分配:
byte -> short -> int -> long -> float -> double.
反之亦然。例如,我们不能自动将long转换为int,因为第一个比第二个需要更多的存储空间,因此信息可能会丢失。为了强制进行这样的转换,我们必须执行显式转换。类型-转换
此处的微妙之处。。。
当j是double,i是int时,i+j有一个隐式类型转换。当整数之间有运算时,Java总是将整数转换为双精度。
为了澄清i+=j,其中i是整数,j是双精度,可以描述为
i = <int>(<double>i + j)
参见:隐式铸造的描述
为了清楚起见,在本例中可能需要将j类型转换为(int)。
很好的问题。Java语言规范证实了您的建议。
例如,以下代码是正确的:短x=3;x+=4.6;并且导致x具有值7,因为它等于:短x=3;x=(短)(x+4.6);