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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

姓名长度不符

中级黑马

  • 黑马币:4

  • 帖子:92

  • 精华:0

© 姓名长度不符 中级黑马   /  2013-3-14 12:15  /  1572 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 姓名长度不符 于 2013-3-14 14:05 编辑

    public static void main(String[] args){
            int j = 0;
            int i;  
            for(i=0; i<100; i++) {  
                      j = j++;
                  }
我知道  j = j++;是先把J的值赋给J,再自增,也就是先把0的值赋给J,再自增,问题是
自增后J变成1了,为什么打印出来是0?
若单独写成j++;则也打印出100
换成j=++j;先自增再赋值,也打印出100;

评分

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

查看全部评分

8 个回复

倒序浏览
本帖最后由 turalyang@gmail 于 2013-3-14 13:05 编辑

额,刚准备回答要吃饭了。。吃完饭回来给你讲。。这个问题我也遇到过{:soso_e136:}

这个问题是这样,这是Java编译器的特点造成的,虽然一般我们不会写j=j++这样额语句,但这样的语句却能让我们发现问题并去探究java里自增语句的执行到底是什么样一个过程。

假如有这样一段语句:
  1. public static void main(String[] args){
  2. int j = 0;
  3. j = j++;
  4. }
复制代码
它的执行过程是这样的:
1.先定义局部变量并且赋初值0
2.将这个0值入栈,这为了把+1之前的数保存起来
3.变量j的值+1,这个时候,变量j里的值是1了,但是,刚入栈的那个数却还是0
4.最后又将栈顶的0值赋给了j,所以j最后始终是0
总结一下就是,java中j=j++这样的语句执行是会先把j自增1之前的值存放起来,姑且我们可以用假设有一个j'来存放j自增之前的值。这时自增1的数是j对应空间内的值,而赋值的时候则是将j'也就是自增1之前的值又赋给了j,这样j的值就不会变化了。

评分

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

查看全部评分

回复 使用道具 举报
额,是这样是什么意思?就是说写成j=j++的话,自增后的J不会赋给J么?
回复 使用道具 举报
本帖最后由 王智威 于 2013-3-14 13:11 编辑


你是不是说i没有自增,那是因为值要想变就一定要赋值。

比如
public static void main(String[] args) {
  int i=0,j=0;
  
  if(i++==++j){
   System.out.println("1");
  }
  System.out.println(i+" "+j);
  if((i=i++)==(j=++j)){
   System.out.println("1");
  }
  System.out.println(i+" "+j);
     }

结果
1 1
1 2

评分

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

查看全部评分

回复 使用道具 举报
姓名长度不符 发表于 2013-3-14 12:24
额,是这样是什么意思?就是说写成j=j++的话,自增后的J不会赋给J么?

我的回答在二楼给出了,可能楼主你想问的就是这么一个问题吧。在遇到这种问题的时候,我们可以利用jdk提供的反编译工具javap来看分析代码执行时具体是如何操作的,这样对我们对java的理解又可以更进一步啦~希望我们一起进步,加油!
回复 使用道具 举报
还有不明白的地方,请继续追问;没有的话请将帖子分类改成【已解决】~
回复 使用道具 举报
李罡 中级黑马 2013-3-14 13:48:54
7#
这个我表示压力很大。。。
先是x++的运算结果是0。然后后面x的值自动加1,变成1。再是x++的值赋给前面的x,前面x的值变为0
所以运算完以后x的值为0.

回复 使用道具 举报
李罡 中级黑马 2013-3-14 13:56:00
8#
另外j=j++在VC里面运行结果是100,所以楼主你要淡定啊~~
回复 使用道具 举报
非常感谢大家,这个问题还是内存里面深层的原理,跟栈空间的特性有关http://blog.csdn.net/junsure2012/article/details/7099222
这个博客里写的很清楚,和2l回答的一样,虽然我对于反编译的代码看起来还是很吃力,所以再看第4遍,不懂再查再问
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马