public class Difficult { public static void main(String[] args)
    {
              int i=2;
              i=i++;
              int j=i++;
              System.out.println(i+":"+j);
     }
}输出的结果是?????

解决方案 »

  1.   

    我执行了一下,结果i=3,j=2.LZ解释下是怎么执行的! "i=i++;"为什么没执行? 
      

  2.   

    i=i++ 相当于
    int temp = i ;
    i++;
    i = temp;
      

  3.   

    4和3吧。
    那个i=i++;的效果,应该和i++;相同才对。
      

  4.   

    老贴了。所以千万不要写 i=i++,直接写 i++ 就可以了。
      

  5.   

    刚才写反了,为什么i=i++这一句无效的原因,可以这样看
    i=i++可以看成是i=i+1,i=2,因为i++是首先将i的值取出,然后对i进行加1运算,将结果赋值给i。所以i=i++的运算过程如下:
    1)取出i的值放入临时内存;
    2)i自身加1赋值给i
    3)从临时内存中取出第一步得到的值赋值给i也就是所,i被赋值了两次,而第二次覆盖掉了第一次的赋值,所以,该表达式没有意义。
      

  6.   

    public class Difficult { public static void main(String[] args) 
        { 
                  int i=2;//这里初始i为2 
                  i=i++; //这里执行i=i++后,i还是2,按照操作符优先级 = 号从左到右执行,这几句实际就是i=i,后面的++无效,如果这里改为i=++i,这样就会执行加1,按照从左到右就执行了++
                  int j=i++; //这一句i自身执行了++,所以j就为3了,这个时候j还没有变,这个就是++i和i++的区别
                  System.out.println(i+":"+j); //输出结果3:2
        } 
      

  7.   

    i=3:j=2
    i = i++;
    是i被付两次值,第一次是i = 3想当于i++,第二次被付值i = 2
      

  8.   

    i=i++在c中属于未定义的情况,可以用两种方式处理: 
    1)i++;i=i 
    2)temp=i;i++;i=temp 
    但在java中是明确规定使用后一种方式
    P.S GOOGLE到的
      

  9.   

    确实不太好理解。和c语言大不一样。
    i=i++;因为++的优先级比=高,这个语句要先执行i++,,这时i的值为3,再执行i=i++,i++这个表示式的值是做++之前的i的值,是2,把2赋值给了i,i又变成2.j=i++;执行顺序同上。所以打印出来的是:3,2
      

  10.   

    int j = 25;
    for(int i = 0; i<1000 ; i++)
    {
    j=j++;
    }
    System.out.println(j);先前见的相同的题
      

  11.   

     i=i++; 
    我们想象中把它拆分成i=i;i=i+1;逐段编译执行。实际上这一句是整体编译起汇编再组合就可能是另外一种流程。i++的汇编中的流程是将i值暂存在栈中,然后将i+1返回引用i,然后弹出栈值。计算机底层的流程也是汇编的这个流程,这样一看显尔易见,i=i++并不是我们想象中的i=i;i=i+1的两句组合了,在计算机底层i不一定就指向i的同一块存储空间,在计算机底层根本没有i,只有放i值的寄存器。
      

  12.   

    i=i++;设i=0;将是这样一个流程:将0值放入堆栈,i自增变成1,弹出堆栈值0给i,所以i=0
      

  13.   

    3:2
    i=i++是先给i赋值,然后在加1,而且不会影响i的赋值
      

  14.   

    以前写WINDOWS里面的BAT脚本时也没有理解编译器的工作流程,想当然,写过类似这样一段set a=1
    set b=%a%
    set a=2认为最后面b=2,实际上用运行这段BAT你会发现,句子变成了
    set a=1
    set b=1
    set a=2
    编译器编译过后,b的值根本和a无关了,这里也是一样i++返回的流程我们想当然的认为它和i有关,其实这句的返回值是个和i无关的返回栈值
      

  15.   

    i=i++ 不等同 i++
    但i=i++ 等同 不写
      

  16.   


    这句int j=i++; //这一句i自身执行了++,所以j就为3了,这个时候j还没有变,这个就是++i和i++的区别
    看到貌似在书写上有问题
    应该是j被i赋值为2,i变成了3。
      

  17.   

    一针见血!
    i = i++;   //执行完后i=2
    j = i++;   //执行完后j=2 i=3 (i++在分号过后才执行自加)
      

  18.   

    可以说这是JAVA的一个陷阱,C#也一样的执行结果。
    不过用C++就不同了
    i = i++; //执行之后i会变成3
      

  19.   

    public class Test {  public static void main(String[] args) { 
                 int i=2; 
                 i=i++; //这里要注意是把i++这个表达式的值赋给i,而i++的这个表达式的值是2,i是3,把表达式的值又赋给 i,那么i又变回2了
                 int j=i++; //这里不用解释了吧,J=3
                 System.out.println(i+":"+j); 
        } 

    //i=i++;并不i++相同,如下代码
    //public class Test {
    // public static void main(String[] args){
    //  int sum=0;
    // for(int i=0;i<100;i++){
    // sum=sum++;
    // }
    // System.out.println(sum);
    // }
    //}
    //结果为0,如果把sum=sum++;改成sum++;就是100了
      

  20.   

    public class Test {  public static void main(String[] args) { 
                 int i=2; 
                 i=i++; //这里要注意是把i++这个表达式的值赋给i,而i++的这个表达式的值是2,i是3,把表达式的值又
                  //赋给 i,那么i又变回2了
                 int j=i++; //这里不用解释了吧,J=3
                 System.out.println(i+":"+j); 
        } 

    //i=i++;并不i++相同,如下代码
    //public class Test {
    // public static void main(String[] args){
    //  int sum=0;
    // for(int i=0;i<100;i++){
    // sum=sum++;
    // }
    // System.out.println(sum);
    // }
    //}
    //结果为0,如果把sum=sum++;改成sum++;就是100了
      

  21.   

    小弟java刚刚入门,之前什么编程语言都没有学过,大家谈的这个问题困惑好久。现在终于知道了!!十分感谢!!
      

  22.   

         int j=i++; //这一句i自身执行了++,所以j就为3了,这个时候j还没有变,这个就是++i和i++的区别J为3了 为什么还没变啊?J怎么不是3呢 不理解