A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 隋营营 中级黑马   /  2012-5-2 15:57  /  3389 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 隋营营 于 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.……奇怪!


14 个回复

倒序浏览
这里涉及到了一个问题。就是
X++和++x的区别。那么X++呢,就会先执行语句,然后再去执行++;
++x就会先++再去执行语句。那么你这里呢。
  1. x = x ++;
复制代码
就会先将 x = 0; 赋值给了x ;然后再自加。
这时候虽然是自加了,但是这个= 号左边的X 依旧是0 ,自加的是右边的X ,它自加完了,内存就释放掉了。
然后输出了X ,也就是0。
所以这就是为什么会出现了死循环。
如果
  1. x  = ++x;
复制代码
这样的说就正常了。
谢谢!

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
杨志 发表于 2012-5-2 16:05
这里涉及到了一个问题。就是
X++和++x的区别。那么X++呢,就会先执行语句,然后再去执行++;
++x就会先++再 ...

你的意思是:x = x++; 的执行过程是这样的:
temp = x;
x++;
x = temp;
回复 使用道具 举报
哥们你的代码没有错,不可能的。 x = x++;不管怎么变,都是会自增的,所以不会无限循环的,要是是死循环的话,你怎么会得到结果呢?
回复 使用道具 举报
++的优先级比较高,仅次于(),x = x++的过程是这样的  
先x=0参与运算,
然后x自增,x的值就为1
,然后进行赋值操作,x又重新被赋为0
回复 使用道具 举报
liuhao411 发表于 2012-5-2 16:21
哥们你的代码没有错,不可能的。 x = x++;不管怎么变,都是会自增的,所以不会无限循环的,要是是死循环的 ...

您可以测试下!我确认没错!
回复 使用道具 举报
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);
                 }
         }
}

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
我的观点和杨志一样的。之前你是定义了x=0;while循环的条件是x<3,在循环内部你的所谓的自增的表达式写的是:x=x++;x=x++这句话的执行过程是这样的,对于后面的x++这个表达式,它是要先参与运算再自加。所以第一次循环后x=x++这个值的到的结果依然还是x=0,它会有一个自加的过程,但是下次循环开始的时候,x的值还是为零,因为你之前一次循环最后得到的x的值是零,所以这次循环开始又是这样的,x被赋与的值还是0,虽然你左边的那个表达式会自增,但是最后的x的值是以被赋值后的值为准,因此在x=x++;中,有半部分根本就没起到作用。所以就会一直满足循环条件,形成一个死循环。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
这是其实还是一个优先级的问题 ,跟http://bbs.itheima.com/forum.php ... amp;page=1#pid68055里面的那个问题颇有类似。x=x++ 是先赋值再叠加  而x=++x是先叠加 ,再赋值。在执行的时候,其实等号后面的已经另辟内存进行运算,尽管两边都是x ,但后面的跟前面那个操作的已经不是同一个数值,也就是后面的虽然自增了,但并没有加到上面定义的那个数值上,也就导致死循环喽
回复 使用道具 举报
  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。导致死循环
回复 使用道具 举报
liuhao411 发表于 2012-5-2 16:21
哥们你的代码没有错,不可能的。 x = x++;不管怎么变,都是会自增的,所以不会无限循环的,要是是死循环的 ...

你把程勋运行一下看看  会不会死循环  呵呵~~  好好想想
回复 使用道具 举报
隋营营 发表于 2012-5-2 16:31
您可以测试下!我确认没错!

我测试过了,没有错的,是有结果的。1,2,3.
回复 使用道具 举报
liuhao411 发表于 2012-5-3 13:20
我测试过了,没有错的,是有结果的。1,2,3.

见鬼了?
回复 使用道具 举报
隋营营 发表于 2012-5-3 13:34
见鬼了?

不会吧,你的机子上没有结果吗?我这里是有结果的。我在eclips是有结果的。
回复 使用道具 举报
就是x++的问题!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马