黑马程序员技术交流社区

标题: 关于自增问题 [打印本页]

作者: 姓名长度不符    时间: 2013-3-14 12:15
标题: 关于自增问题
本帖最后由 姓名长度不符 于 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;

作者: 杨冉    时间: 2013-3-14 12:22
本帖最后由 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的值就不会变化了。
作者: 姓名长度不符    时间: 2013-3-14 12:24
额,是这样是什么意思?就是说写成j=j++的话,自增后的J不会赋给J么?

作者: 王智威    时间: 2013-3-14 13:03
本帖最后由 王智威 于 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
作者: 杨冉    时间: 2013-3-14 13:08
姓名长度不符 发表于 2013-3-14 12:24
额,是这样是什么意思?就是说写成j=j++的话,自增后的J不会赋给J么?

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


作者: 李罡    时间: 2013-3-14 13:56
另外j=j++在VC里面运行结果是100,所以楼主你要淡定啊~~
作者: 姓名长度不符    时间: 2013-3-14 14:05
非常感谢大家,这个问题还是内存里面深层的原理,跟栈空间的特性有关http://blog.csdn.net/junsure2012/article/details/7099222
这个博客里写的很清楚,和2l回答的一样,虽然我对于反编译的代码看起来还是很吃力,所以再看第4遍,不懂再查再问




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