是否可以使用任何原始类型的增量运算符?

时间:2015-06-26 11:58:41

标签: 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 number = 0D;
int temp = number + 1;
number = temp;

在第二种情况下,我们应该更喜欢double += 1D吗?

3 个答案:

答案 0 :(得分:4)

++(前缀或后缀)不适用于int,如果您将其与其他原始类型一起使用,这并不意味着有{{1}的中间转换回来。

请参阅Java语言规范:

正如JLS所说,binary numeric promotion适用于变量和值int。如果1 number++number,则表示double被视为1

因此,如果doublenumber++,则number += 1Dnumber的工作方式相同。没有必要明确地double

注意:如果您在问题中建议进行number += 1D的中间转换,那么您会期望:

int

会导致double number = 0.5; number++; 变为number而不是1.0,因为转换会丢弃小数。但是,正如你所看到的,事实并非如此。

答案 1 :(得分:1)

不要担心。编译器知道如何最好地增加int,float或double类型。它将为每个案例生成有效的代码。如果你看一下生成的汇编程序代码,它最像是为:

生成的相同代码
doubleVar++;
++doubleVar;
doubleVar += 1;
doubleVar += 1.0;

但请注意,对于课程类型,事情要复杂得多。在那里,使用operator +或operator + = overload。通常,后增量操作更耗时,因为必须在增量之前保存对象状态。因此,您应该习惯于始终使用预增量版本,即使对于标量类型 - 除非您确实需要增量后操作。

答案 2 :(得分:1)

代码

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