Java (可能奇怪的)长增量行为?
我问这个问题有点尴尬,但下面代码片段的结果让我难堪:Java (可能奇怪的)长增量行为?,java,long-integer,increment,Java,Long Integer,Increment,我问这个问题有点尴尬,但下面代码片段的结果让我难堪: System.out.println("incrementResultResponses() has been invoked!"); final long oldValue = resultResponses; final long newValue = resultResponses++; System.out.println("Old value = " + oldValue); System.out.println("New valu
System.out.println("incrementResultResponses() has been invoked!");
final long oldValue = resultResponses;
final long newValue = resultResponses++;
System.out.println("Old value = " + oldValue);
System.out.println("New value = " + newValue);
其结果如下:
incrementResultResponses() has been invoked!
Old value = 0
New value = 0
为什么??并发性会对这里的结果产生任何影响吗?顺便说一句,
resultResponses
是一个long
后缀++
操作符返回旧的值(在递增之前)。您想使用前缀++
:
final long oldValue = resultResponses;
final long newValue = ++resultResponses;
如果要在赋值之前增加oldValue,则必须将
++
置于变量之前:
final long newValue = ++resultResponses;
这意味着增量发生在语句执行之前,而不是之后。因为增量会在赋值之后(增量后)增加值。这正是
resultResponses++
应该做的。如果希望resultResponses为1,则需要使用增量前,即
++resultResponses
参考,以了解后缀和前缀的工作原理。
如上述答案所述,您可以使用:
final long oldValue = resultResponses;
final long newValue = ++resultResponses;
或者,为了使其更美观,您还可以使用:
final long oldValue = resultResponses++;
final long newValue = resultResponses;
这也将导致相同的输出。可能的重复-可能不是最好的重复,但实际上有数百个。请搜索“[java]后期增量”。@Mat,是的,我的错。如果可能的话,我希望其他人投票结束这个问题,作为一个重复。这是一个令人沮丧的问题。出于某种原因,我认为将后缀运算符赋给变量会迫使该操作返回新值:/为什么是个无赖?这就是后缀和前缀++
的定义:后缀增加变量并返回旧值,为什么前缀增加变量并返回新值。如果您想要后者,请使用前缀而不是后缀++
。这太疯狂了。我知道至少5种其他语言,其中number++会立即返回新值。我想知道为什么它在Java中不起作用。谢谢你们学习了一些东西new@DavidFari真的吗?java继承了C++和C++的这种行为,也在C语言和JavaScript中继承了同样的工作方式。所以这不是Java特有的东西。