请问int i=0; i=i++;执行这2句话后变量i的值为什么是0的?
不是1吗?

解决方案 »

  1.   

    i=i++;
    是先执行i=i;//此时i = 0
    再执行i++;i = ++i;
    先执行++i;//此时i = 1
    再把上面的结果集给i
      

  2.   

    java解惑中的经典谜题。当++操作符被置于一个变量值之后时,其作用就是一个后缀增量操作符(postfix increment operator)[JLS 15.14.2]:表达式j++的值等于j在执行增量操作之前的初始值。
      

  3.   


    我们对比两段程序和它们的汇编代码(javap -c xxx得到): 
       int i=0;     i=i++;                                                 int i=0;         i=++i;     ------------------------------------------------------------------------------------       
    0: iconst_0                                                       0: iconst_0    
    1: istore_2                                                       1: istore_2    
    2: iload_2                                                        2: iinc 2, 1    
    3: iinc 2, 1                                                      3: iload_2    
    4: istore_2                                                       4: istore_2    
    5: return                                                         5: return    
    它们区别在于2,3两句。    
    从优先级来看  "前++" >" =" > "后++",所以汇编代码清楚地显示了代码执行地过程。    
    第二段代码地结果是1,没有问题。    
    从汇编代码来看,=赋值地过程是先利用临时变量计算=右边地值,然后在赋给左边地变量。    
    这样,我们就很容易解释第一段代码地运行结果了:    
      临时变量先得到i原来地值是0(汇编代码1),这时候考虑优先级,=大于后++,所以临时变量就执行赋值操作,
      之后临时变量先读出i地值(汇编代码2),再进行++操作(汇编代码3),但是++操作只是在临时变量自己身上加一,不会影响原来地i值。    
      按照上面地思路再分析第二段代码,也就顺理成章了:)
      

  4.   

    这也是月经贴了:
    http://hi.baidu.com/freish/blog/item/aa947f8b42c4e118c9fc7a07.html
      

  5.   

    public class LamarTest {
    public static void main(String arg[]){
    int i=0,j=0;
    j=i++;
    System.out.print("i = " + i + "\n" + "j = " + j);
    }
    }i = 1
    j = 0
      

  6.   

    太简单了,孩子你的C语言基础部行,得好好补补,要不做不了嵌入式,我来给你解析下。
    int i=0;初始化i为0,i=i++;首先考了一个赋值运算的方向性,最后当然是自增啦,
    首先要求赋值号右边的自增表达式了,i++的值是0,如果是++i则是1,把0赋值给变量i,
    结果当然是0了。你是误以为把i++后i的值为1后赋值给变量i。
      

  7.   

    int i=0;
    int j=i++;
    response.write(i.tostring());结果 1response.write(j.tostring());
    结果 0
      

  8.   

    这问题c语言的结果跟java结果不一样的!
    按c的方式分析这个问题准错
      

  9.   

    1.先去的i=0的值作为表达式i++的值,即现在i为0;
    2.再i++自增 为1;
    3.将第一步得到的0赋值给i,所以i最后的值为0
      

  10.   

    其实
    int i=0;
    i=i++;
    i=i++;
    .......
    不管加多少次,最后i都是0,通过看字节码更容易深层次理解虚拟机的执行过程。
      

  11.   

    int i=0;
    i=i++;
    system.out.println(i);
    为什么i没++呢就执行打印操作了呢?
      

  12.   

    i=i++;
    操作分3步:
    1取出i的数值
    2将i的值加上1
    3将第一步得到的值付给i
      

  13.   

    Java是从左向右的运算方式  所以先让i = i;然后i再自增
      

  14.   

    Java™ Puzzlers: Traps, Pitfalls, and Corner Cases.chm
      

  15.   

    请问int i=0; i=i++;执行这2句话后变量i的值为什么是0的?
    不是1吗?
    i++是先赋值再自增,故0++先把0赋给i,再自增,如果再输出i,就是1了。
      

  16.   

    事先声明,本人所说的是为了让楼主更好得了解其本质,所以篇幅稍显得多。首先楼主要弄清楚一个概念和一项原则。一个概念就是表达式,表达式是由数字、算符、数字分组符号(括号)、自由变量和约束变量等以能求得数值的有意义排列方法所得的组合(摘自百度)。这个概念中有三点最重要,一是能求得数值,二就是有意义排列方法,第三点就是组合,第二点又跟我后面要说的一项原则有密切联系。其中,楼主还要弄清楚java语句和表达式的关系以及区别,这个楼主可以自己研究,我就不在此长篇大论,只提及一点,有些语句去掉后面代表它语句身份的“;”,就变成了一个表达式,就比如说你问题中的这两个语句中的第二条:“i=i++;”,这里要说的是,声明语句不符合这条规律,也就是两个语句中的第一条。表达式概念中第一点能求得数值,也就是说表达式本身可以作为一个值来使用,就拿第二句来说,显然,如果作为表达式,也就是“i=i++”(注意,此处没有分号),它的值就是i本身,但现在我们的目的就是要知道i到底最后等于多少,这也就用到了第三点重要的地方:组合,由组合你也可以推出,表达式的组合还是表达式(当然前提是要有意义),反过来说,你也可以知道表达式是可以由表达式组合而成的。所以,i=i++也就可以拆分成“i”和“i++”两个表达式以及“=”,同时,第二条重要的地方派上用场了,对应于java中的地方也就是运算符的优先级,“=”(也就是赋值运算符)的优先级低于“++”运算符,也就是“i++”表达式先进行运算,显然,“i++”的值为0,这里你要明白,“i++”的值虽然受i的初始值的影响,但是值最终是由“i”和“++”符号的位置决定的,至于这个表达式的值存储在什么位置,就需要你自己研究了,主要是栈和堆的问题,这里就不多说了。接下来你完全把“i=i++”看成是“i=a”,而a的值就是“i++”的值,也就是0,所以变量i的值最终是0。这里楼主可能会有疑惑,i++不是自增吗,那i的值不就是1吗?是的,i的值确实曾经是1,但是是在i++执行完之后,还没有进行“i=i++”这个表达式的整体求值也就是赋值运算符开始运算之前的时候。这道题依我来看,主要考察的就是表达式、运算符优先级以及++运算符的特性,楼主可以多看看书中这几个方面的内容。
      

  17.   

    i=i++;
    是先执行i=i;//此时i = 0
    再执行i++;i = ++i;
    先执行++i;//此时i = 1
    再把上面的结果集给i
      

  18.   

    这个涉及寄存器的具体操作:
    1.首先i被赋值为0,并保存在它的存储空间;
    2.接着的“i=i++;”是将i的值0取出来,把0值放在相应的寄存器,然后将执行i++操作
    3.最后将相应寄存器的0值赋给i;
    所以最后i的值为0.当然这个在C++中执行的话具体结果又会不一样,这与其的具体实现操作有关,所以不要复杂地使用++和--操作,不一理解而且可能会有歧义
      

  19.   

    建议这类问题先百度 google一下,这种题面试也问?表示怀疑???
      

  20.   

    int a=0;
    int temp=0;
    //++i
     int  add(){
       i=i+1;
       temp=i
    return temp }
    //i++
    int add(){
     temp=i;
    i=i+1;
    return temp;
    }
    //进行I++,++I运算得有三点。
    1、运算符的优先级。
    2、I++,++I 都返回是一个中间变量的结果。只是这个中间变量赋值的时间不同。
    3、I++,++I运算过后,i的值都会加1;
      

  21.   

    这道题真的不简单……
    C和JAVA 的运行结果是不同的,所以如果只是分析 前++和后++的优先级问题,恐怕还得慎重思考……
      

  22.   

    i++相当于一个函数
    int j=i;
    i++;
    return j;所以i=i++;相当于
    int j=i;
    i++;
    i=j;
      

  23.   

    而java中的++相当于一个函数,取完数据之后执行
      

  24.   

    在上学的时候就常常搞错这个问题。在java里面,++是一个单独的运算符,java里的计算和咱学的算术是一样的。
    对于i=i++是先将i的值赋值给i,再对i进行加1,在加后没有对i赋值,所以i的值是没有变的,先i=i; i+1
    对于i=++i是先给i+1,然后将结果赋值给i,即i=i  
      

  25.   

    i=i++;
    是先执行i=i;//此时i = 0
    再执行i++;i = ++i;
    先执行++i;//此时i = 1
    再把上面的结果集给i
      

  26.   

    你放到Eclipse里面运行一下, 你会发现结果是0的。
      

  27.   

    学过c语言了吗?
    int   i=0;
    printf("%d",i++);
    你看看输出什么。
      

  28.   

    i++是在i值被使用后才+1,换句话没有被使用的话就不会加1,怎么才算使用呢就是进行过运算包括复制但是i=i相当于没有操作所以不会有+1