此代码的输出为:
c: 1 , id: 0
我想知道为什么输出不是:
c: 0 , id: 1
class A {
private static long c;
private final long id = c++;
public A() {
print("c: " + c + " , id: " + id);
}
}
答案 0 :(得分:4)
因为像c++
这样的表达式是这样的:
c
;记住这一点(例如tmp = c
;)c
tmp
)因此,在这种情况下,您从c = 0
开始,因此id
变为0 ...但c
在此过程中会增加,因此c
为1后表达式已经过评估。
有关详细信息,请参阅Java语言规范的section 15.14.2。提取物:
在运行时,如果操作数表达式的评估突然完成,则后缀增量表达式突然完成,原因相同,并且不会发生增量。否则,将值1添加到变量的值中,并将总和存储回变量中。在添加之前,对值1和变量的值执行二进制数字提升(第5.6.2节)。如果必要,在存储之前,通过缩小的基元转换(第5.1.3节)和/或经过装箱转换(第5.1.7节)将总和缩小到变量的类型。后缀增量表达式的值是存储新值之前变量的值。
答案 1 :(得分:1)
id = c++
将c
的值分配给id
,然后增加c
。就好像你做了以下事情:
c = 0;
id = c; // assigns zero
c = c + 1;
请尝试id = ++c
。
答案 2 :(得分:1)
因为您使用的是c ++。
c ++意味着您首先将变量保存到您的id,然后增加++。
如果您使用++ c,则首先递增,然后将其保存为id。
但它将返回c:1 id:1,因为c ++表示c = c + 1!
如果你说:id = c + 1,你将获得c:0和id:1