【问题标题】:increments order in javajava中的递增顺序
【发布时间】:2021-05-16 21:06:27
【问题描述】:

为什么在java中这段代码输出1:

int bracketsTest = 0;
int resultBrackets = 1 + bracketsTest + bracketsTest++; // return 1

但这输出 2:

int bracketsTest = 0;
int resultBrackets = 1 + bracketsTest++ + bracketsTest; // return 2

我生活在两个 sn-ps 应该相等的世界中,因为在两个结果中我们都执行以下操作:

  1. 1 + 0 + 括号测试 // 括号测试 = 0 我们将零放在括号测试++中,然后括号测试 = 1
  2. 1 + 0 + 1 = 2 // 我们将括号Test = 1 放在最后一个参数中
    但事实证明递增/递减操作不是最高优先级操作? (因为我们在代码 sn-p 中放置括号测试的位置很重要)

【问题讨论】:

  • 第一个执行1 + 0 + 0。最后一个执行1 + 0 + 1,因为在读取最后一个加数(+ bracketsTest;)之前变量已经递增。我确定 JLS 准确地指定了这个 sn-p 必须在某处执行的顺序(在这种情况下从左到右)。
  • 您似乎在混合运算符优先级和评估顺序? ++ 的优先级高于 +,但在 Java 中评估顺序始终是从左到右。
  • 任何 ++ 符号表示您递增变量,因此如果您使用 ++bracketsTest 这意味着您将递增它然后使用它,如果您使用 bracketsTest++ 这意味着我将使用它现在使用旧值,然后在任何下一次使用中,我将使用增量值。所以在第二个例子中,你增加了它并在之后使用它,所以你将拥有增加的值,这就是为什么第二个例子显示 2 并且首先显示 1

标签: java operator-precedence evaluation post-increment jls


【解决方案1】:

评估顺序

您似乎将运算符优先级评估顺序混为一谈。请看JLS§15.7. Evaluation Order

Java 编程语言保证运算符的操作数似乎以特定的计算顺序进行计算,即从左到右

还有:

Java 编程语言保证运算符的每个操作数(除了条件运算符 &&、|| 和 ? :)似乎在 操作本身的任何部分之前完全计算执行

另外:

Java 编程语言遵循括号明确指示的求值顺序和运算符优先级隐含指示的求值顺序

但该部分仅在您执行操作后才起作用。在此之前,所有操作数都已被完全求值。


第一个 sn-p

知道了这一点,我们就可以破译发生了什么。第一个sn-p:

1 + bracketsTest + bracketsTest++

将首先评估所有操作数(从左到右),所以我们得到:

1. operand: 1
2. operand: 0
3. operand: 0 (and increment bracketsTest)

在计算第三个操作数时,它将增加bracketsTest。现在,它将所有内容加在一起,我们得到1 + 0 + 0 = 1 作为结果。


第二次sn-p

第二个sn-p:

1 + bracketsTest++ + bracketsTest;

也是从左到右评估的,所以我们有:

1. operand: 1
2. operand: 0 (and increment bracketsTest)
3. operand: 1 (because it was just incremented)

因此我们收到1 + 0 + 1 = 2

【讨论】:

  • 是的,现在我明白了,非常感谢! Indeex I 混合运算符优先级和评估顺序
【解决方案2】:

第二个加法表达式从左到右求值,如下:

int resultBrackets = 1 + bracketsTest++ + bracketsTest;

1               (add 1)
bracketsTest++  (add zero, then increment bracketsTest by 1)
bracketsTest    (add 1, the current value of bracketsTest)

因此总和为 2。

【讨论】:

  • 再次阅读 OPs 问题后,我认为他已经知道这一点,而是询问为什么订单是这样的,以及在哪里(在 JLS 中)写下来并解释了这一点。不过可能是错的。
  • ...我已经一步一步地解释了我们如何得到 2 的总和。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-31
  • 2019-05-07
  • 1970-01-01
  • 2013-12-25
  • 1970-01-01
  • 2015-05-23
相关资源
最近更新 更多