黑马程序员技术交流社区

标题: 关于x=x++结果为什么结果都是1的问题 [打印本页]

作者: LiuWei2015    时间: 2015-4-23 23:24
标题: 关于x=x++结果为什么结果都是1的问题
其实看了很多贴友的回复,没有解决根本问题。后来我在Eclipse里debug了一下,还是没发现为什么。
后来我想是不是运算符优先级的问题,但是按逻辑来看应该也行得通不应该是1才对,在寝室问了5个同学都说递增
于是带着疑惑我来找度年,再这样一个帖子中找到了答案:http://www.bitscn.com/plus/view.php?aid=20350
看到的吧友可以去看看,程序是这个
public class test
{
        public static void main(String[] args)
        {
                int x=1;
               
                for(;;)
                {
                        
                        x=x++;
                        System.out.println(x);
                }
        }
求解 为什么结果为1   , 请详解 x=x++ 是怎么运算的   ?多谢
}
很多吧友回答的不粗略这里提供一个连接

作者: kayaking    时间: 2015-4-23 23:32
学习了!~
作者: chenxin2015    时间: 2015-4-24 08:36
x=x++与x=++x的区别?    ++在前是++先参与运算,然后再自增,   ++在后边是先进行运算,然后再自增。
作者: LiuWei2015    时间: 2015-4-24 08:39
chenxin2015 发表于 2015-4-24 08:36
x=x++与x=++x的区别?    ++在前是++先参与运算,然后再自增,   ++在后边是先进行运算,然后再自增。 ...

不是这样的,如果按运算符的优先级来看的话,赋值运算符排在最后,你看我上面有个链接,里面说是和java的机制有关。

作者: 柒夜    时间: 2015-4-24 09:00
学习了,谢版主
作者: 星之钥匙    时间: 2015-4-24 09:00
学习了,一直没怎么分清
作者: LiuWei2015    时间: 2015-4-24 09:06
柒夜 发表于 2015-4-24 09:00
学习了,谢版主

不客气,能帮到你就好,我也是受益者:#
作者: LiuWei2015    时间: 2015-4-24 09:08
星之钥匙 发表于 2015-4-24 09:00
学习了,一直没怎么分清

没搞懂的问题一定要继续搞得,学程序这东西不能含糊
作者: 星之钥匙    时间: 2015-4-24 09:12
LiuWei2015 发表于 2015-4-24 09:08
没搞懂的问题一定要继续搞得,学程序这东西不能含糊

会的,但是有时候比如说和计算表达式一起连用什么的就很容易出错了
作者: LiuWei2015    时间: 2015-4-24 09:13
星之钥匙 发表于 2015-4-24 09:12
会的,但是有时候比如说和计算表达式一起连用什么的就很容易出错了

是的,所以要了解表达式的优先级关系,理清楚关系了自然就不会错了,加油:P
作者: 星之钥匙    时间: 2015-4-24 09:16
LiuWei2015 发表于 2015-4-24 09:13
是的,所以要了解表达式的优先级关系,理清楚关系了自然就不会错了,加油 ...

这个最头疼了,大神有没有总结啊,求指教
作者: 突然世界晴    时间: 2015-4-24 09:18
这个按照内存就知道了啊。
先自增然后有两个值,一个是i=0, 一个是i自增为1; 然后在将i=0 赋值,
作者: LiuWei2015    时间: 2015-4-24 09:24
星之钥匙 发表于 2015-4-24 09:16
这个最头疼了,大神有没有总结啊,求指教

大神不敢当,我也是新手啊,恩要说具体总结我只能给你这张我之前做这题百度了一下的优先级表,希望能帮到你


作者: LiuWei2015    时间: 2015-4-24 09:27
突然世界晴 发表于 2015-4-24 09:18
这个按照内存就知道了啊。
先自增然后有两个值,一个是i=0, 一个是i自增为1; 然后在将i=0 赋值,  ...

不是啊,x的初始值为1不是0,让我费解的是为什么内存识别X++会这样,而++x就会递增下去呢?求大神指点:#
作者: 突然世界晴    时间: 2015-4-24 09:32
噢,那你把我的0看成1就是,。
内存存储步骤是
先开辟一个内存i=1;然后运算i++.另外有一个新值i=2; 然后计算等于。虚拟机发现等于这个是前++,于是取第一个i=1的值。
作者: LiuWei2015    时间: 2015-4-24 09:38
突然世界晴 发表于 2015-4-24 09:32
噢,那你把我的0看成1就是,。
内存存储步骤是
先开辟一个内存i=1;然后运算i++.另外有一个新值i=2; 然后计 ...

是的这个我明白,例如我们平时写for(int i=0;;i++)为什么单独写i++就会自增给自己,加了赋值有神吗不一样,大神我是不是很专牛角尖,确实分不清这里
作者: LiuWei2015    时间: 2015-4-24 09:40
突然世界晴 发表于 2015-4-24 09:32
噢,那你把我的0看成1就是,。
内存存储步骤是
先开辟一个内存i=1;然后运算i++.另外有一个新值i=2; 然后计 ...

i++;单独写的时候为啥又会得到递增
作者: 突然世界晴    时间: 2015-4-24 09:42
i=i++,不是说了 也自增了吗。 但是自增后 你又把i重新赋值为老值,新值没有任何作用,。
而直接i++;自增后没有重新赋到老值上面去,虚拟机会直接用新值替代老值。
作者: 13699266500    时间: 2015-4-24 09:42
我觉得是先输出后再+1所以输出的是1;
作者: LiuWei2015    时间: 2015-4-24 09:48
13699266500 发表于 2015-4-24 09:42
我觉得是先输出后再+1所以输出的是1;

这是循环,第一次输出1还可以想象,但是for里没有写任何判断条件,是死循环,每次都是1,要是先+1的话后面应该是递增才对啊!哥们你也要搞懂这个问题,赶紧一起拜大神
作者: LiuWei2015    时间: 2015-4-24 09:58
突然世界晴 发表于 2015-4-24 09:42
i=i++,不是说了 也自增了吗。 但是自增后 你又把i重新赋值为老值,新值没有任何作用,。
而直接i++;自增 ...

大神我明白了,你看是这样不,在内存中开辟了两个空间,1、i(旧值)  2、i++(新值),按照运算符优先级,先算i++,然后执行赋值运算符=,把旧值赋值给自己,然后新值被释放了对吗??
作者: mrleeapple    时间: 2015-4-24 11:34
x=x++;首先实现的是x=x的运算,结果是x依然是一,然后实现x自增一。但是由于x++的自增并没有赋给任何变量,所以无效。
作者: cjmjava    时间: 2015-4-24 14:06
++或--的运算原则:
++或-- 在变量的右侧:它的运算原则是先把变量空间中的值在内存中临时开辟个空间保存,然后给当前参与运算的这个变量空间中+1或-1,接着使用临时空间中的数据和其他运算符运算。

++或--在变量的左侧:在运算的时候,会先给变量空间中+1或-1,然后使用改变后的这个变量空间中的数据参与其他运算。





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