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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 谢波 中级黑马   /  2013-3-26 07:27  /  2398 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 谢波 于 2013-3-26 16:46 编辑
  1. public class Test {

  2.         public static void main(String[] args) {
  3.                 int x = 0;
  4.                 x = x++;
  5.                 System.out.println(x);
  6.         }
  7. }
复制代码
打印结果是0
求解,谢谢

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

14 个回复

倒序浏览
昨天晚上有一位友友问过了,本来我也考虑错了,现在弄懂了。
int x = 0;
x = x++;      // 将(x++)这整个语句赋值给x,(x++)这个语句的值为0,所以打印结果为0.

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
x= x++,这句话中,是先将x的值(为0),赋给了自己x,此时,你打印的是赋值后的x,而你这两个变量恰恰是同一个x,就相当于是将赋值后的x覆盖掉了赋值前的x++,所以,x的结果是赋值后的值,如果你这里换做另一个y变量,那么y的值就是1了,如下:
int y = 0;
x = y++;
这里的x还是0,y就是1了。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
int x = 0;
x = x++;//这里你先把x=0赋值给x,然后再++,因为这是后++,所以是先运算后自增。所以这里x=0
回复 使用道具 举报
本帖最后由 谢波 于 2013-3-26 08:45 编辑

{:soso_e140:}谢谢大家了 ,还是不明白
不是先赋值再自增吗
如果按这中顺序来说的话,应该是1啊
谁能给个让人信服的说法啊
回复 使用道具 举报
public class Test {

        public static void main(String[] args) {
                int x = 0;
                x = x++;// 看这里,你的x++ 之后的x的值是1了   但是你左边的x是0,你为其重新赋值了
                System.out.println(x);// 因而你打印的结果是0 这个不是X++ 的问题,是你对变量赋值没看明白
        }
}

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
夏凡 中级黑马 2013-3-26 09:14:25
7#
  1. public class Test {

  2.         public static void main(String[] args) {
  3.                 int x = 0;
  4.                 [b]x = x++;[/b]
  5.                 System.out.println(x);
  6.         }
  7. }
复制代码
你的代码里面 x=x++; 这个语句的执行过程分解如下:
1,右边x先把值(即0)赋给左边x,此时左边x的值为0
2,赋值操作之后,右边的x自加1,它的值为1
右边的x相当于是个中间变量与输出无关,左边的x是最终变量也就是最后的输出

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
谢波 中级黑马 2013-3-26 09:17:57
8#
夏凡 发表于 2013-3-26 09:14
你的代码里面 x=x++; 这个语句的执行过程分解如下:
1,右边x先把值(即0)赋给左边x,此时左边x的值为0
2 ...

能描述下jvm在内存中对这几句话的操作吗?谢谢
我很想知道x++跑哪儿去了:handshake
回复 使用道具 举报
谢波 发表于 2013-3-26 08:43
谢谢大家了 ,还是不明白
不是先赋值再自增吗
如果按这中顺序来说的话,应该是1啊

换个角度想的话,或许会很容易

int x = 0 ;//在栈内开辟空间,并初始化为0 ,因为是成员变量所以是栈内存储,而且还必须初始化,才能运算
x = x++; // x 是先进行赋值运算,然后自增,也就是说栈内存储的是运算之后的结果

把上句话注释掉,执行 x = ++x; //先自增,然后赋值运算,可以看出x = 1;这样的结果或许难于理解,但是通过比较,可以加强对JVM 底层运算的理解。

x++; 与++x ;最后结果都是 自增 +1 运算;为何  (x =x++)== (x =++x)  结果为 false ? 原因就在于 “=”,“+”这两个运算符的优先级 相同,或者 这样讲就会很清楚了,x=x; x=++x;
x的赋值运算执行完毕,就会刷新内存,你打印的输出流,接收的也就是内存里刷新后的结果

慢慢来,后面的IO流里面有这个机制的详细的操作,加油。。。:)

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
谢波 发表于 2013-3-26 09:17
能描述下jvm在内存中对这几句话的操作吗?谢谢
我很想知道x++跑哪儿去了 ...

这里有个详细介绍,希望对你有帮助  http://www.51testing.com/html/12/n-830112.html
回复 使用道具 举报
应该是这样理解的:1.首先把x的值“0”提取出来,放到临时存储区。
                  2.再在运算区把x的值“0”自加为“1”;
                  3.把运算区的“1”赋值给x;此时x为“1”;
                  4.再把临时存储去的“0”赋值给x;此时x为“0”。

点评

3q  发表于 2013-3-26 16:47

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
public class Test {
        public static void main(String[] args) {
                int x = 0;
                x = x++;
                System.out.println(x);

        }
}
对于x = x++;这句话的理解,我们先来看看图1-1:

x++在于它自身的值要先参与其他运算(我们也可以理解为x先赋值给左边x的过程),所以x在临时区域(2)中存储了x的值0,然后x在方法区(3)中完成自增后将结果1赋值给x,如(1)的位置。此时,x完成了右边的运算(注意这个时候,右边才算完成运算,但是赋值的x还是右边x的自增并没有赋值给左边的x)。但是,最终需要的还是把临时区域存储的0,如图(2)指向(4)赋值给左边的x。


11.png (9.99 KB, 下载次数: 26)

11.png

点评

谢了,哥们  发表于 2013-3-26 16:47

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
胡志超 发表于 2013-3-26 08:19
int x = 0;
x = x++;//这里你先把x=0赋值给x,然后再++,因为这是后++,所以是先运算后自增。所以这里x=0
...

赋值运算的优先级比自增运算的要低,这么解释不通。
回复 使用道具 举报
王廷顺 发表于 2013-3-26 16:42
赋值运算的优先级比自增运算的要低,这么解释不通。

上面的那些人不都是这个意思,你看完再讲。。。还有 你也解释下啊
回复 使用道具 举报
可以稍做修改 可能就好回答了
int x=0;
  int x1;
  x1=x++;
x ==0,赋值在前,所以x1==0;
然后 x自增1,变为1.

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1 新人加油

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马