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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 缤纷落叶   /  2015-3-29 16:43  /  10011 人查看  /  44 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

for(A;B;C){}   中,B处不写的话 默认为1,会一直判断为YES,死循环了
回复 使用道具 举报
右手年华 来自手机 中级黑马 2015-4-2 20:03:09
22#
问题出现在x = x++;这个语句上 先是执行把自身的0赋给x,x=0,之后再执行++操作。由于一个语句只能给一个变量赋值一次。所以++之后的不会赋值给x。所以x是0.
回复 使用道具 举报
x=x++:

上面的式子可以理解为x=x=x+1
内存中世纪运行过程如下:
1、将x的值存在内存中 此时x的值为0,也就是将0放到了内存中
2、执行x+1  并执行后面的 =  赋值给x,x变成1
3、执行前面的 = ,此时将内存中挂载的0有赋值给前面的x,所以x又变成了0
回复 使用道具 举报
((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 ;后出栈
回复 使用道具 举报
在内存中   也就是 同时在内存中会生成两个式子   x=0(前面的等式)  x=x+1(后面的等式)  关键就是这两个等式谁先执行  根据结果很明显是后面的先执行
回复 使用道具 举报
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++是先使用,后自加运算。也就是每一次,x=x++;都是先把x的初始化值0赋值给x,然后自加为1,然后又被赋值为0.所以x的值永远为0.且无限循环。
回复 使用道具 举报
楼主不用太纠结,这个思路是没错的,至少你在C语言上用这个表达式可以正确的自增,而不会返回0。

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


回复 使用道具 举报
这是死循环,根本停不下来
回复 使用道具 举报
x=x++,可以分成两个部分理解,x=x,这是将x=0复制给前面个x,后面的x++,是x自己自增,不会赋值给前面的x,你打印的x的值也是前面的x的值,所以是打印0,
回复 使用道具 举报
for(;;)里的条件表达式初始化值为ture,无论x怎么自增,条件都是ture。所以一直循环
回复 使用道具 举报
x=x++,先是x=x 然后再++,就可以看成x=x  0=0 ,再++的时候x已经赋值完毕为0,你把x=x++换成 y=x++ 再分别打印 x和y 你就能明白了
回复 使用道具 举报
本帖最后由 Doug 于 2015-4-5 12:45 编辑



以上,只是根据结果瞎猜。
回复 使用道具 举报
原因就是x++是先使用,后自增,所以,x总是先被赋值为0,后加1,结果总是0.又是无限循环,所以打印结果总是0.解决了吗?
回复 使用道具 举报
  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. }
复制代码


这样能达到你的目的,而且更清楚吧。
回复 使用道具 举报
本帖最后由 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就足以表达了。
回复 使用道具 举报
x = x++;
这个语句的执行过程其实有三步:
1、取出右边表达式的值,即x 的值,为0;
2,将x身的值加一;
3,将右边表达式的值赋给左边变量,即x=0;

所以打印出x的值一直为0
回复 使用道具 举报
学习了~!
回复 使用道具 举报
Hivan 中级黑马 2015-4-10 21:22:43
39#
x = 0; x=x++;
++在后,先赋值再运算,而且你这是赋值运算,不会++,所以每次都是先把0赋值给x再给你输出,输出完成后再++,然后第二次的时候x又等于0了,又先赋值了,所以每次结果都是0,你想让x变,可以吧++写在前面.写在前面就是先+1后赋值/
回复 使用道具 举报
胡树泉 发表于 2015-3-29 22:20
这个首先需要明确for(;;)是一个无限循环,而语句x=x++相当于x=x;x=x+1.也就是说x先将当前的值0赋值给本身,然 ...

个人感觉你的答案比较正确
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马