【问题标题】:Are there any guarantees when modifying arguments during method invocation?在方法调用期间修改参数时是否有任何保证?
【发布时间】:2013-02-11 00:43:04
【问题描述】:

在 Java 中,当将参数传递给方法并修改传递的参数期间时,方法调用是否保证结果符合预期?
例如
a.method(++i);

是否保证例如,在method 内部,变量i 将更新 价值?

或者a.method(i++)method会在递增之后还是之前得到i的值?

对于所有类似情况也相同。
我记得这在 C++ 中是被禁止的,因为特定于实现,但也许我记错了。

【问题讨论】:

标签: java methods jvm arguments


【解决方案1】:

前缀/后缀递增/递减运算符的java语言规范:

... 值 1 被添加到变量的值中,并且总和被存储回变量中... 前缀增量表达式的值是 变量存储新值后

... 值 1 被添加到变量的值中,并且总和被存储回变量中... 后缀增量表达式的值是变量 在新值之前的值存储

我认为这很清楚。该函数将在前缀情况下获取增量值,而不是在后缀情况下。

【讨论】:

    【解决方案2】:

    表达式++i在方法被调用之前被评估

    来自 Java 语言规范的部分 "Runtime evaluation of method invocation"

    ... 其次,评估参数表达式。 ... 第五,创建一个新的激活帧,必要时进行同步,并将控制转移到方法代码。

    来自 Java 语言规范的部分 "Prefix increment operator"

    前缀自增表达式的值是新值存储后变量的值。

    【讨论】:

      【解决方案3】:

      Java 没有问题,方法会收到更新后的值。

      【讨论】:

      • 但是如何备份呢?
      • 这是一个关于 Java 的基本问题,您似乎对来自 c++ 经验的担忧。我觉得不需要备份它。我知道在 Java 中,这是有保证的,而且在我使用 Java 的 8 年中,我或我认​​识的任何人都不会失败。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-12
      相关资源
      最近更新 更多