java对任何基元类型使用增量运算符可以吗?
我们都知道int++
会将变量值增加1,也就是说:
int number = 0;
int temp = number + 1;
number = temp;
其他基本类型也允许这样做:
double number = 0D;
number++;
因此,我想知道上面的代码是否会被执行为:
double number = 0D;
double temp = number + 1D;
number = temp;
或:
double number = 0D;
int temp = number + 1;
number = temp;
在第二种情况下,我们是否应该选择double += 1D
# 1 楼答案
++
(前缀或后缀)并不是只在int
上起作用的东西,如果您将它与其他原语类型一起使用,这并不意味着存在到int
的中间转换请参阅Java语言规范:
正如JLS所说,binary numeric promotion应用于变量和值
1
。在number++
的情况下,其中number
是double
,这意味着1
被视为double
因此,如果
number
是double
,那么number++
的工作原理与number += 1D
相同。没有必要显式地执行number += 1D
注意:如果像你在问题中所建议的那样,中间转换为
int
,然后再转换回来,那么你可以预期:将导致
number
变成1.0
而不是1.5
,因为转换将丢弃小数。但是,正如你所见,情况并非如此# 2 楼答案
别担心。编译器知道如何最好地递增int、float或double类型。它将为每种情况生成高效的代码。如果你看一下生成的汇编程序代码,它很像是为以下内容生成的相同代码:
但是要注意,对于类类型来说,事情要复杂得多。这里使用运算符+或运算符+=重载。一般来说,增量后操作更耗时,因为必须在增量之前保存对象状态。因此,您应该习惯于始终使用增量前版本,即使对于标量类型也是如此,除非您确实需要增量后操作
# 3 楼答案
密码
被执行为
生成的字节码