Java-为什么这段代码会出现无限循环?
有一次写java代码,手误,写出了类似下面的代码:
public class Tests {
public static void main(String[] args) throws Exception {
int x = 0;
while(x<3) {
x = x++;
System.out.println(x);
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(10)
应该x会一直为0吧,因为x=x++这种语法没有明确的定义,所以有时候不同的语言和不用的编译器都会造成结果的不同,实现机制不同而已..在c++里面应该不会死循环~
x++就是一个表达式,这个表达式返回值是x的现有值。
如果x = x++;陷入无限循环,说明了这个语句处于这样的流程,
x先自身加一,然后又被之前的x++表达式的返回值所覆盖。
x=x++
x=x 后 x++
写成x=++x 就好了
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
不知道是否解释的清楚。
实际上跟这断代码效果相同的
m=x;
x=x+1;
x=m;
执行 x = x++; 后x是 0,执行过程如下:
1.取出x,为0;
2.x++,x为1;
3.赋值,x为0
其实这个是运算符号和x++与++x的问题 如果你写成x=x++ 那么先赋值 之后在自增 如果你写成
x=++x 那么就是先自增在赋值 你可以试试 使用先自增 在赋值 就能跳出循环了 得到你想要的效果
没想错的话是x一直为0吧?
过程应该是先处理x++,虽然x暂时变为1,但是其后的赋值操作又让x变回了0...
问题出在x=x++;这是因为x=x这个先操作了,所以x的值还是原来的值,而看似x++的操作,由于这两条语句结合成一条来写,它所操作的内存地址就不一样了,它会临时为x++分配一块新的内存来做运算操作,这样就造成了前面的赋值的x的值永远是0,
while(x<3) {
x = x;
x++;
}
同样的语句,拆成两条直观的来写就不一样,这样作们操作的内存地址是同一块,所以就不会造成死循环。
operator ++ (int)
{
T t = a;
a = a + 1;
return t;
}
这是后置++的实现.
x = x++;
就是x = x;