【问题标题】:post increment operation in while loop (java)在while循环中发布增量操作(java)
【发布时间】:2015-07-28 00:42:29
【问题描述】:

最近遇到了这个问题

int i = 10;
while (i++ <= 10) {
    i++;
}
System.out.print(i);

答案是 13 ,请解释一下 13 是怎么回事?

【问题讨论】:

  • 你认为答案应该是什么,为什么?
  • 后增量运算符应用 after(或“post”)它出现的表达式;但在评估任何其他表达式之前。
  • 这很棘手。您可能期望答案是 12。为什么?因为关系条件评估和循环分支可能被认为是原子的。显然不是,但这不是一个不合理的假设。很难想象Java“存储”了增量操作并在之后评估了关系条件,但分支出循环之前“插入”了它。我想知道由此产生的代码在汇编程序/机器语言级别是什么样的。
  • 相反,这可以归结为将关系条件的评估存储在布尔值(位/字节?)中,执行增量操作,然后对存储的布尔值执行分支如果操作。

标签: java loops while-loop


【解决方案1】:
  • i = 10。看 i,与 10 比较
  • i = 10. 10
  • i = 10. 递增 i(根据 while 表达式)
  • i = 11。在循环中,递增 i
  • i = 12。看 i,与 10 比较
  • i = 12。12 不是
  • i = 12. 增加 i(根据 while 表达式)
  • i = 13

【讨论】:

  • 谢谢,我错过了while循环中增量的最后一步。
【解决方案2】:

这是我可以解决这个问题的另一种方法。 让f(ref i) 成为一个函数,它通过引用接收 i 并将它的值增加 1。所以f(ref i) = i + 1

现在我们有了f(ref i),上面的代码可以写成

int i = 10
while( (f(ref i) -1) <=10 )
{
   f(ref i);
}

我会在返回时将 f(ref i) 替换为等效的 i 值并得到类似的答案

while(11 - 1 <= 10) {12}
while (13 -1 <= 10) -> break;

所以 i = 13。

【讨论】:

    猜你喜欢
    • 2014-10-21
    • 2015-02-12
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 2011-11-07
    • 2015-10-10
    • 2023-03-14
    • 2018-06-26
    相关资源
    最近更新 更多