Java 可以对任何基元类型使用增量运算符吗?

Java 可以对任何基元类型使用增量运算符吗?,java,increment,primitive,Java,Increment,Primitive,我们都知道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+=1D?这个++(前缀或后缀)

我们都知道
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+=1D

这个
++
(前缀或后缀)并不仅仅适用于
int
,如果您将它与其他基元类型一起使用,这并不意味着存在到
int
的中间转换

请参阅Java语言规范:

正如JLS所说,应用于变量和值
1
。在
number++
的情况下,其中
number
double
,这意味着
1
被视为
double

因此,
number++
的工作原理与
number+=1D
相同,前提是
number
double
。无需显式执行
number+=1D

注意:如果如您在问题中所建议的那样,中间转换为
int
,然后再转换回来,那么您可以预期:

double number = 0.5;
number++;

将导致
number
1.0
而不是
1.5
,因为转换将丢弃小数。但是,正如你所看到的,情况并非如此。

别担心。编译器知道如何最好地递增int、float或double类型。它将为每种情况生成有效的代码。如果您查看生成的汇编程序代码,它最像是为以下对象生成的相同代码:

doubleVar++;
++doubleVar;
doubleVar += 1;
doubleVar += 1.0;
但是要注意,对于类类型来说,事情要复杂得多。这里使用运算符+或运算符+=重载。通常,增量后操作更耗时,因为必须在增量之前保存对象状态。因此,您应该习惯于始终使用增量前版本,即使对于标量类型也是如此——除非您确实需要增量后操作。

代码

double number = 0D;
number++;
被执行为

double number = 0D;
number = number + 1D;
生成的字节码

// double number = 0D;
0: dconst_0
1: dstore_1

// number + 1D
2: dload_1
3: dconst_1
4: dadd

// number =
5: dstore_1

你试过会发生什么吗?@Kayaman任何原语类型都会递增1。好吧,这是你的答案。你有问题吗?我想一个更有趣的例子是
double number=0.5因为它实际上在那里起了作用。
// double number = 0D;
0: dconst_0
1: dstore_1

// number + 1D
2: dload_1
3: dconst_1
4: dadd

// number =
5: dstore_1