【问题标题】:(Potentially odd) long increment behavior?(可能很奇怪)长增量行为?
【发布时间】:2012-02-27 23:25:36
【问题描述】:

问这个问题有点不好意思,但是下面这段代码sn-p的结果让我难住了:

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

为什么?并发会对这里的结果有什么影响吗?顺便说一句,resultResponseslong

【问题讨论】:

  • Strange behaviour of the increment operators in Java? 的可能副本 - 可能不是最好的副本,但实际上有数百个。请搜索“[java] post-increment”。
  • @Mat,是的,我的错。如果可能的话,我希望其他人投票关闭这个问题作为重复。

标签: java long-integer increment


【解决方案1】:

后缀++ 运算符返回 值(在递增之前)。你想使用前缀++:

final long oldValue = resultResponses;
final long newValue = ++resultResponses;

【讨论】:

  • 这太糟糕了。出于某种原因,我认为将后缀运算符分配给变量会强制操作返回新值。 ://
  • 何为无赖?这就是后缀和前缀++ 的定义方式:后缀递增变量并返回旧值,为什么前缀递增变量并返回新值。如果您想要后者,请使用前缀而不是后缀 ++
  • 太疯狂了。我知道至少 5 种其他语言,其中 number++ 立即返回新值。我想知道为什么它不能在 Java 中工作。感谢你们学习新东西
  • @DavidFariña 真的吗? Java 从 C 和 C++ 继承了这种行为,在 C# 和 JavaScript 中也以相同的方式工作。所以这不是 Java 特有的东西。
【解决方案2】:

因为增量会增加值分配后(后增量)。这正是 resultResponses++ 应该做的。
如果希望resultResponses为1,则需要使用Pre-Increment,即++resultResponses

【讨论】:

    【解决方案3】:

    如果您想在赋值之前增加 oldValue,您必须在变量之前放置 ++

    final long newValue = ++resultResponses;
    

    这意味着增量发生在语句执行之前而不是之后。

    【讨论】:

      【解决方案4】:

      请参考this,了解postfixprefix 的工作原理。 正如上面的答案中提到的,你可以使用这个:

      final long oldValue = resultResponses;
      final long newValue = ++resultResponses;
      

      或者为了让它更漂亮,你也可以使用:

      final long oldValue = resultResponses++;
      final long newValue = resultResponses;
      

      这也会产生相同的输出。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-19
        • 2019-07-28
        • 2018-10-23
        • 1970-01-01
        相关资源
        最近更新 更多