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

5黑马币
class A{
public static void main(String[] agrs){
int x=0;
for(;;){
x=x++;
System.out.println(x);
}
}
}


44 个回复

正序浏览
for(;;)的意思是无条件循环
x=x++;的意思是先把x的值赋给x(x=0)输出的就是这个x,所以x=0;,然后x加1,但这个x不输出,
因为x是基本数据类型 所以x的值不会改变(基本数据类型传递不会改变原来的值),而引用数据类型传递会改变原来的值
回复 使用道具 举报
在这里其实就是看x=++x和x=x++的,前者先自增再赋值,因此每次循环,后面将比前面的x大1,而后者是先赋值再自增,也就是每次将x=0赋值给x,所以打印的永远是0.
回复 使用道具 举报
x = 0;
for(;;)
{
    x = x++;
}

在这个死循环中的执行流程如下:
1、先执行x++表达式,x++表达式的值 为x当前的值 为0,
2、然后会去执行x=x+1的操作,x = 1;
3、再后会将1中x++表达式的值0取出来给变量x, 那么x由1变为0了。
4、输出x的值 ,自然就是0咯
循环会一直重复以上四步过程,所以会一直输出0的
回复 使用道具 举报
胡树泉 发表于 2015-3-29 22:20
这个首先需要明确for(;;)是一个无限循环,而语句x=x++相当于x=x;x=x+1.也就是说x先将当前的值0赋值给本身,然 ...

个人感觉你的答案比较正确
回复 使用道具 举报
Hivan 中级黑马 2015-4-10 21:22:43
39#
x = 0; x=x++;
++在后,先赋值再运算,而且你这是赋值运算,不会++,所以每次都是先把0赋值给x再给你输出,输出完成后再++,然后第二次的时候x又等于0了,又先赋值了,所以每次结果都是0,你想让x变,可以吧++写在前面.写在前面就是先+1后赋值/
回复 使用道具 举报
学习了~!
回复 使用道具 举报
x = x++;
这个语句的执行过程其实有三步:
1、取出右边表达式的值,即x 的值,为0;
2,将x身的值加一;
3,将右边表达式的值赋给左边变量,即x=0;

所以打印出x的值一直为0
回复 使用道具 举报
本帖最后由 1017161726 于 2015-4-6 12:27 编辑

for( ; ; ){} 这个是无限循环的。这个程序是停不下来的。直到内存溢出。
其次,对于x++和++x的区别:x++这个表达式的结果是0,但此时x的值为1。++x表达式的结果是1,然后赋给x,x的值就是1.
如果是把表达式的结果0赋给x,x就又变成了0.
如此循环,打印的就都是0了。
程序语句中最好不出现x=x++或者x=++x这样的语句。因为很多情况下,简单的x++或者++x就足以表达了。
回复 使用道具 举报
  1. public class A{
  2.         public static void main(String[] args){
  3.                 int x=0;
  4.                 while(true){
  5.                       System.out.println(x++);
  6.                 }
  7.         }
  8. }
复制代码


这样能达到你的目的,而且更清楚吧。
回复 使用道具 举报
原因就是x++是先使用,后自增,所以,x总是先被赋值为0,后加1,结果总是0.又是无限循环,所以打印结果总是0.解决了吗?
回复 使用道具 举报
本帖最后由 Doug 于 2015-4-5 12:45 编辑



以上,只是根据结果瞎猜。
回复 使用道具 举报
x=x++,先是x=x 然后再++,就可以看成x=x  0=0 ,再++的时候x已经赋值完毕为0,你把x=x++换成 y=x++ 再分别打印 x和y 你就能明白了
回复 使用道具 举报
for(;;)里的条件表达式初始化值为ture,无论x怎么自增,条件都是ture。所以一直循环
回复 使用道具 举报
x=x++,可以分成两个部分理解,x=x,这是将x=0复制给前面个x,后面的x++,是x自己自增,不会赋值给前面的x,你打印的x的值也是前面的x的值,所以是打印0,
回复 使用道具 举报
这是死循环,根本停不下来
回复 使用道具 举报
楼主不用太纠结,这个思路是没错的,至少你在C语言上用这个表达式可以正确的自增,而不会返回0。

楼主可以看看此网友的博文,里面讲的很详细。x=x++;为什么会等于0,不是逻辑上的问题,而是java虚拟机底层实现问题。
http://blog.csdn.net/brooksychen/article/details/1624753


回复 使用道具 举报
这是一个无限循环。因为x++是先使用,后自加运算。也就是每一次,x=x++;都是先把x的初始化值0赋值给x,然后自加为1,然后又被赋值为0.所以x的值永远为0.且无限循环。
回复 使用道具 举报
int x = 0;
x=x++;
分解1:x = (x++);
分解2:根据x++的特性,调用C指针,分解为如下式子。
分解3: ((x=x) (++))
分解4:汇编结果
x=x【此时在内存中是这样的 x=0】 ; 先进栈
x=x+1 【此时在内存中是这样的 x=0+1】 (x++) 后进栈

分解5:CPU处理结果
x=x+1 【此时在内存中是这样的 x=0+1】;
        (x++) 先出栈,结果x变量等于1
x=x ;【此时在内存中是这样的 x=0】
        后出栈,结果x变量等于0

分解6:最后结果,x变量值仍然是0
回复 使用道具 举报
在内存中   也就是 同时在内存中会生成两个式子   x=0(前面的等式)  x=x+1(后面的等式)  关键就是这两个等式谁先执行  根据结果很明显是后面的先执行
回复 使用道具 举报
((x=x) (++))
x=x ; 先进栈 ---> 后出栈
x=x+1 ; (x++) 后进栈  --->  前出栈
x=x++
分解1:x = (x++);
分解2:根据x++的特性,调用C指针,分解为如下式子。
分解3: ((x=x) (++))
分解4:汇编结果
x=x ; 先进栈
x=x+1 ; (x++) 后进栈

分解5:CPU处理结果
x=x+1 ; (x++) 先出栈
x=x ;后出栈
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马