我们都知道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
吗?
答案 0 :(得分:4)
++
(前缀或后缀)不适用于int
,如果您将其与其他原始类型一起使用,这并不意味着有{{1}的中间转换回来。
请参阅Java语言规范:
正如JLS所说,binary numeric promotion适用于变量和值int
。如果1
number++
为number
,则表示double
被视为1
。
因此,如果double
是number++
,则number += 1D
与number
的工作方式相同。没有必要明确地double
。
注意:如果您在问题中建议进行number += 1D
的中间转换,那么您会期望:
int
会导致double number = 0.5;
number++;
变为number
而不是1.0
,因为转换会丢弃小数。但是,正如你所看到的,事实并非如此。
答案 1 :(得分:1)
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