为啥这段代码会进入无限循环? [复制]
Posted
技术标签:
【中文标题】为啥这段代码会进入无限循环? [复制]【英文标题】:Why does this code goes into infinite loop? [duplicate]为什么这段代码会进入无限循环? [复制] 【发布时间】:2014-02-13 07:37:12 【问题描述】:考虑以下代码:
public class Game
public static void main(String[] args)
int x = 0;
while (x < 1)
x = x++;
使用我的编译器,这段代码会进入无限循环,但为什么呢?
首先,我们将 x
的值放入 x
,然后 only 然后我们将 1 添加到 x
,然后我预计 1 < 1
将是 false ,并且while 循环将终止 ...
但是不,这不会发生。
那么无限循环的原因可能是什么?
【问题讨论】:
对于调试器来说听起来像是一个很好的问题。一步一步通过它。或者在里面放一些日志语句。x=x++;
保持 x
不变 - 你增加它,然后用旧值(增加之前的值)替换它。
-1 不签出“相关”(第二个问题包含答案)
特别是当你说“首先,我们将 x 的值放入 x 中,然后才将 x 加 1”时,你似乎感到困惑。确实,从词法上讲,赋值在增量之前,但是赋值右侧的值必须在赋值发生之前计算出来。 (该值是 x 的 old 值,因为增量是 post-increment)。
【参考方案1】:
表达式x++
是一个后增量,这意味着表达式的值是旧值0
,然后将其分配回x
,因此x
始终是0
在x = x++;
之后。
要跳出无限循环,不要将其分配回x
,保持x
、1
的后增量值不变:
while (x < 1)
x++;
【讨论】:
【参考方案2】:x++
几乎等同于
some-temporary = x;
x = x + 1;
now use the value of some-temporary
所以x = x++;
等价于
some-temporary = x;
x = x + 1;
x = some-temporary;
所以你应该可以看到为什么加1的部分没有效果。
【讨论】:
【参考方案3】:这是因为x
在被使用后会增加。因此,发生的扩展操作序列将是:
oldX = x
x++
,即x = x + 1
x = oldX
oldX
是一个虚构的变量。
发生的情况是x
总是被分配oldX
,在我们的例子中是0
,导致无限循环。 x++
部分将被忽略。
解决方案:将x = x++
替换为x++
,或者,如果您真的 需要,x = ++x
。
【讨论】:
【参考方案4】:x = x++
不会做你想做的事。将其替换为x++
。
x++
等同于x = x + 1
,所以你的分配没有意义。
可以在此处的答案中找到有关此问题的更多信息:
Why does this go into an infinite loop?
【讨论】:
我就是这个意思:x = x++;
@ron 与 t = x + 1 相同; x = x;
不,@ron,你的意思是x = x + 1;
,但是你选择写它。以上是关于为啥这段代码会进入无限循环? [复制]的主要内容,如果未能解决你的问题,请参考以下文章