Java-为什么这段代码会出现无限循环?

Java-为什么这段代码会出现无限循环?

瑾兮 发布于 2016-11-02 字数 265 浏览 1221 回复 10

有一次写java代码,手误,写出了类似下面的代码:

public class Tests {
public static void main(String[] args) throws Exception {
int x = 0;
while(x<3) {
x = x++;
System.out.println(x);
}
}
}

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(10

灵芸 2017-10-02 10 楼

应该x会一直为0吧,因为x=x++这种语法没有明确的定义,所以有时候不同的语言和不用的编译器都会造成结果的不同,实现机制不同而已..在c++里面应该不会死循环~

泛泛之交 2017-10-02 9 楼

x++就是一个表达式,这个表达式返回值是x的现有值。
如果x = x++;陷入无限循环,说明了这个语句处于这样的流程,
x先自身加一,然后又被之前的x++表达式的返回值所覆盖。

灵芸 2017-09-26 8 楼

x=x++
x=x 后 x++
写成x=++x 就好了

虐人心 2017-06-21 7 楼

 iconst_0 创建字面值常量0,把该常量放入栈中
istore_1 把该字面值0赋予局部变量i
iload_1 将i变量的值进栈顶,即栈顶是0,这个0与上面那个常量0不是同一个地址
iconst_3 创建字面值常量3并进栈
if_icmpge 22 比较当前栈顶两个数据的值,即i和常量3,如果i-3大于等于0则跳至22行,用完之后i和3就已经出栈了
iload_1 将局部变量i的值再次进栈,即当前栈顶是0
iinc 1, 1 对i变量引用值进行自增操作,不是在栈顶进行自增,也就是说栈顶还是0,而i所指的那个空间里的0变成了1
istore_1 将当前栈顶的值,即0,存储到变量i中,覆盖了上一部的操作,即i还是0
getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
iload_1
invokevirtual #3; //Method java/io/PrintStream.println:(I)V
goto 2

不知道是否解释的清楚。

偏爱自由 2017-06-08 6 楼

实际上跟这断代码效果相同的
m=x;
x=x+1;
x=m;

偏爱自由 2017-03-04 5 楼

执行 x = x++; 后x是 0,执行过程如下:
1.取出x,为0;
2.x++,x为1;
3.赋值,x为0

清晨说ぺ晚安 2017-03-03 4 楼

其实这个是运算符号和x++与++x的问题 如果你写成x=x++ 那么先赋值 之后在自增 如果你写成
x=++x 那么就是先自增在赋值 你可以试试 使用先自增 在赋值 就能跳出循环了 得到你想要的效果

瑾兮 2017-01-18 3 楼

没想错的话是x一直为0吧?

过程应该是先处理x++,虽然x暂时变为1,但是其后的赋值操作又让x变回了0...

夜无邪 2016-12-26 2 楼

问题出在x=x++;这是因为x=x这个先操作了,所以x的值还是原来的值,而看似x++的操作,由于这两条语句结合成一条来写,它所操作的内存地址就不一样了,它会临时为x++分配一块新的内存来做运算操作,这样就造成了前面的赋值的x的值永远是0,
while(x<3) {

 x = x;
x++;

}
同样的语句,拆成两条直观的来写就不一样,这样作们操作的内存地址是同一块,所以就不会造成死循环。

偏爱自由 2016-12-08 1 楼

operator ++ (int)
{

 T t = a;
a = a + 1;
return t;

}
这是后置++的实现.
x = x++;
就是x = x;