黑马程序员技术交流社区

标题: 为什么这个变成了无限的循环? [打印本页]

作者: 隋营营    时间: 2012-5-2 15:57
标题: 为什么这个变成了无限的循环?
本帖最后由 隋营营 于 2012-5-2 20:18 编辑

自己测试了一段代码:
public class Testext {
        public static void main(String[] args) {
                int x = 0;
                while (x < 3) {
                        x = x++;
                        System.out.println(x);
                }
        }
}
结果输出x的值依然是0.……奇怪!



作者: 杨志    时间: 2012-5-2 16:05
这里涉及到了一个问题。就是
X++和++x的区别。那么X++呢,就会先执行语句,然后再去执行++;
++x就会先++再去执行语句。那么你这里呢。
  1. x = x ++;
复制代码
就会先将 x = 0; 赋值给了x ;然后再自加。
这时候虽然是自加了,但是这个= 号左边的X 依旧是0 ,自加的是右边的X ,它自加完了,内存就释放掉了。
然后输出了X ,也就是0。
所以这就是为什么会出现了死循环。
如果
  1. x  = ++x;
复制代码
这样的说就正常了。
谢谢!
作者: 隋营营    时间: 2012-5-2 16:10
杨志 发表于 2012-5-2 16:05
这里涉及到了一个问题。就是
X++和++x的区别。那么X++呢,就会先执行语句,然后再去执行++;
++x就会先++再 ...

你的意思是:x = x++; 的执行过程是这样的:
temp = x;
x++;
x = temp;
作者: 刘_浩    时间: 2012-5-2 16:21
哥们你的代码没有错,不可能的。 x = x++;不管怎么变,都是会自增的,所以不会无限循环的,要是是死循环的话,你怎么会得到结果呢?

作者: 倪杭乘    时间: 2012-5-2 16:23
++的优先级比较高,仅次于(),x = x++的过程是这样的  
先x=0参与运算,
然后x自增,x的值就为1
,然后进行赋值操作,x又重新被赋为0
作者: 隋营营    时间: 2012-5-2 16:31
liuhao411 发表于 2012-5-2 16:21
哥们你的代码没有错,不可能的。 x = x++;不管怎么变,都是会自增的,所以不会无限循环的,要是是死循环的 ...

您可以测试下!我确认没错!
作者: 崔仁军    时间: 2012-5-2 16:50
1 首先你要明白 ++x 和x++ 的算法   
  a.    a = x++    它的作用是将x的值先赋给a ,然后在让x的值自增1;
  b.    a = ++x    它的作用是将x的值先自增1,然后将自增的结果赋给a;
2 如果你使用 x++ 或++x  但是不把他们赋给任何变量 那么他们结果就是一样的   
修改代码如下 ;
public class Testext {
         public static void main(String[] args) {
                 int x = 0;
                 while (x < 3) {
                         x++;
                         System.out.println(x);
                 }
         }
}

作者: i蓝蓝蓝天    时间: 2012-5-2 16:51
我的观点和杨志一样的。之前你是定义了x=0;while循环的条件是x<3,在循环内部你的所谓的自增的表达式写的是:x=x++;x=x++这句话的执行过程是这样的,对于后面的x++这个表达式,它是要先参与运算再自加。所以第一次循环后x=x++这个值的到的结果依然还是x=0,它会有一个自加的过程,但是下次循环开始的时候,x的值还是为零,因为你之前一次循环最后得到的x的值是零,所以这次循环开始又是这样的,x被赋与的值还是0,虽然你左边的那个表达式会自增,但是最后的x的值是以被赋值后的值为准,因此在x=x++;中,有半部分根本就没起到作用。所以就会一直满足循环条件,形成一个死循环。
作者: 索学超    时间: 2012-5-2 20:36
这是其实还是一个优先级的问题 ,跟http://bbs.itheima.com/forum.php ... amp;page=1#pid68055里面的那个问题颇有类似。x=x++ 是先赋值再叠加  而x=++x是先叠加 ,再赋值。在执行的时候,其实等号后面的已经另辟内存进行运算,尽管两边都是x ,但后面的跟前面那个操作的已经不是同一个数值,也就是后面的虽然自增了,但并没有加到上面定义的那个数值上,也就导致死循环喽
作者: 王冬冬    时间: 2012-5-2 22:57
  1. int x=0;
  2.                 System.out.println(x);
  3.                 System.out.println(x++);
  4.                 System.out.println(++x);
复制代码
看看结果:0  0  2。
可见x++运算过后,x的值为1,x++整体的值还是0,结果运算x=x++;又把0赋给了x。导致死循环
作者: 贠(yun)靖    时间: 2012-5-2 22:57
liuhao411 发表于 2012-5-2 16:21
哥们你的代码没有错,不可能的。 x = x++;不管怎么变,都是会自增的,所以不会无限循环的,要是是死循环的 ...

你把程勋运行一下看看  会不会死循环  呵呵~~  好好想想
作者: 刘_浩    时间: 2012-5-3 13:20
隋营营 发表于 2012-5-2 16:31
您可以测试下!我确认没错!

我测试过了,没有错的,是有结果的。1,2,3.
作者: 隋营营    时间: 2012-5-3 13:34
liuhao411 发表于 2012-5-3 13:20
我测试过了,没有错的,是有结果的。1,2,3.

见鬼了?
作者: 刘_浩    时间: 2012-5-3 13:41
隋营营 发表于 2012-5-3 13:34
见鬼了?

不会吧,你的机子上没有结果吗?我这里是有结果的。我在eclips是有结果的。
作者: 孙魁星    时间: 2012-5-5 18:01
就是x++的问题!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2