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语言规范:
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