黑马程序员技术交流社区

标题: x=0,x=x++,循环后x还是等于0,求详细分析 [打印本页]

作者: 缤纷落叶    时间: 2015-3-29 16:43
标题: x=0,x=x++,循环后x还是等于0,求详细分析
class A{
public static void main(String[] agrs){
int x=0;
for(;;){
x=x++;
System.out.println(x);
}
}
}



作者: 刘帅    时间: 2015-3-29 16:43
首先,将x的值保存起来,然后x加加,之后再将保存起来的x值赋给x。
作者: chenlanaq    时间: 2015-3-29 17:01
本帖最后由 chenlanaq 于 2015-3-29 17:03 编辑

x++是先存好x的值0,然后将x自加=1,再然后将储存的0返回,结果是x=0;看过c++的运算符重载就知道什么回事了。

作者: 向天笑    时间: 2015-3-29 18:18
debug as运行看看就知道了
作者: _etc    时间: 2015-3-29 20:24
for(;;){
x=x++;
System.out.println(x);
}

这里是一个死循环,一直不停打印0的,这几行代码就和
while(true)
{
System.out.println(x);
}

一个效果。
作者: natsu647    时间: 2015-3-29 20:50
x=x++的运算过程是:
int temp = x ;//这时temp = 0
x +=1 ;//这时x = 1
把temp的值赋给等号左面,x = 0。

更复杂一点的题目:
int x = 5 ;
x=x+ (x++) + (++x) ;
运算过程是:
temp = 5
temp = 5 + 5
x +=1 ;//运算x++ ,这时x=6
x +=1 ;//运算++x ,这时x=7
temp = 5 + 5 +7
把temp的值赋给等号左面,x = 17。

满意的话给个分。

作者: silencelj    时间: 2015-3-30 07:23
死循环

作者: 弥风冻雪    时间: 2015-3-30 08:11
for循环你好歹给个出口呀,一直这么死循环…
作者: minliang    时间: 2015-3-30 08:38
死循环啦
作者: One_M    时间: 2015-3-30 10:25
x=0,   x=x++    对于x++是先赋值再自增,So   x=x++是x=0  ==》0++    0++并没有再赋值给X  所以,在这个循环中x值一直都是0....   
作者: bianzhiguo6    时间: 2015-3-30 17:20
这个看下for的后跟括号内没有任何条件,是个死循环,看第一次运行,x=x++;初始值为零,x++是先赋值再自增,所以输出的x还是零,返回的话,因为for循环没有条件干涉,所以他会一直死循环下去
作者: Jarywong    时间: 2015-3-31 00:06
每一次的循环都有X自加1,当是X是先赋值再自加,所以每次赋值后保存下来的X都是0,而加一后的那个X都不保存
作者: shw16888    时间: 2015-3-31 11:53
亲,你的程序中没有循环控制条件,会一直执行,输出x的值,死循环。
作者: huanghe1103    时间: 2015-3-31 21:12
死循环。
作者: 静默小和尚    时间: 2015-3-31 21:17
for(;;)
{
}
你这个里面没有循环条件,当然就不会运行x++ 啊,x就是你赋值的初始值0咯。
作者: 静默小和尚    时间: 2015-3-31 21:29
如果把x=x++换成x=++x你试试,或者直接x++,就会递增了,但是是无限循环
作者: 呐拽    时间: 2015-3-31 22:28
本帖最后由 呐拽 于 2015-3-31 23:09 编辑

问题出现在x = x++;这个语句上 先是执行把自身的0赋给x,x=0,之后再执行++操作。由于一个语句只能给一个变量赋值一次。所以++之后的不会赋值给x。所以x是0.
作者: mono    时间: 2015-4-1 14:11
这个程序是一个死循环,因为你的for语句中没有给定该程序循环的条件,虚拟机调用运行循环语句时没有出口,x++ 不会自增,x就是你赋值的初始值0不会被改变。

作者: 百谈千语    时间: 2015-4-1 19:57
这种问题真的会给技术分吗。。:P等待结果
作者: 屠赞华    时间: 2015-4-2 02:11
死循环呀呀呀
作者: Jarywong    时间: 2015-4-2 07:52
for(A;B;C){}   中,B处不写的话 默认为1,会一直判断为YES,死循环了
作者: 右手年华    时间: 2015-4-2 20:03
问题出现在x = x++;这个语句上 先是执行把自身的0赋给x,x=0,之后再执行++操作。由于一个语句只能给一个变量赋值一次。所以++之后的不会赋值给x。所以x是0.
作者: Howie    时间: 2015-4-2 22:31
x=x++:

上面的式子可以理解为x=x=x+1
内存中世纪运行过程如下:
1、将x的值存在内存中 此时x的值为0,也就是将0放到了内存中
2、执行x+1  并执行后面的 =  赋值给x,x变成1
3、执行前面的 = ,此时将内存中挂载的0有赋值给前面的x,所以x又变成了0
作者: 43453186@qq.com    时间: 2015-4-2 22:32
((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 ;后出栈
作者: Howie    时间: 2015-4-2 22:32
在内存中   也就是 同时在内存中会生成两个式子   x=0(前面的等式)  x=x+1(后面的等式)  关键就是这两个等式谁先执行  根据结果很明显是后面的先执行
作者: lingrixin    时间: 2015-4-2 22:41
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

作者: 杨大萌    时间: 2015-4-3 11:30
这是一个无限循环。因为x++是先使用,后自加运算。也就是每一次,x=x++;都是先把x的初始化值0赋值给x,然后自加为1,然后又被赋值为0.所以x的值永远为0.且无限循环。
作者: 君嘘    时间: 2015-4-3 16:25
楼主不用太纠结,这个思路是没错的,至少你在C语言上用这个表达式可以正确的自增,而不会返回0。

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



作者: 君北羽    时间: 2015-4-3 22:09
这是死循环,根本停不下来
作者: 忆丶残梦顾惜    时间: 2015-4-4 19:51
x=x++,可以分成两个部分理解,x=x,这是将x=0复制给前面个x,后面的x++,是x自己自增,不会赋值给前面的x,你打印的x的值也是前面的x的值,所以是打印0,
作者: 时过境迁    时间: 2015-4-4 19:59
for(;;)里的条件表达式初始化值为ture,无论x怎么自增,条件都是ture。所以一直循环
作者: 努力    时间: 2015-4-4 20:44
x=x++,先是x=x 然后再++,就可以看成x=x  0=0 ,再++的时候x已经赋值完毕为0,你把x=x++换成 y=x++ 再分别打印 x和y 你就能明白了
作者: Doug    时间: 2015-4-5 00:25
本帖最后由 Doug 于 2015-4-5 12:45 编辑



以上,只是根据结果瞎猜。

作者: 杨大萌    时间: 2015-4-5 11:12
原因就是x++是先使用,后自增,所以,x总是先被赋值为0,后加1,结果总是0.又是无限循环,所以打印结果总是0.解决了吗?
作者: major2015    时间: 2015-4-6 10:41
  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:24
本帖最后由 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就足以表达了。

作者: AndroidM    时间: 2015-4-6 21:20
x = x++;
这个语句的执行过程其实有三步:
1、取出右边表达式的值,即x 的值,为0;
2,将x身的值加一;
3,将右边表达式的值赋给左边变量,即x=0;

所以打印出x的值一直为0

作者: 天马行空_黑马    时间: 2015-4-7 17:52
学习了~!
作者: Hivan    时间: 2015-4-10 21:22
x = 0; x=x++;
++在后,先赋值再运算,而且你这是赋值运算,不会++,所以每次都是先把0赋值给x再给你输出,输出完成后再++,然后第二次的时候x又等于0了,又先赋值了,所以每次结果都是0,你想让x变,可以吧++写在前面.写在前面就是先+1后赋值/
作者: 蜡笔    时间: 2015-4-14 12:49
胡树泉 发表于 2015-3-29 22:20
这个首先需要明确for(;;)是一个无限循环,而语句x=x++相当于x=x;x=x+1.也就是说x先将当前的值0赋值给本身,然 ...

个人感觉你的答案比较正确
作者: windform    时间: 2015-4-15 20:01
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的
作者: fanxia_2007    时间: 2015-4-20 23:29
在这里其实就是看x=++x和x=x++的,前者先自增再赋值,因此每次循环,后面将比前面的x大1,而后者是先赋值再自增,也就是每次将x=0赋值给x,所以打印的永远是0.
作者: 胡亚辉    时间: 2015-6-1 22:44
for(;;)的意思是无条件循环
x=x++;的意思是先把x的值赋给x(x=0)输出的就是这个x,所以x=0;,然后x加1,但这个x不输出,
因为x是基本数据类型 所以x的值不会改变(基本数据类型传递不会改变原来的值),而引用数据类型传递会改变原来的值





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