public class Test {

public static void main(String[] args){
int j=0;
for(int i=0;i<100;i++){
j=j++;
}
System.out.println(j);
}
}输出结果为0;求解释,谢谢

解决方案 »

  1.   

    这个不是变量的问题,而是你的这句j=j++;
    他是表示先赋值后加,就是先把值赋给变量而后本身在+1的,而不是表示每循环加一次,把得到的结果赋给左边的j,而你在最开始就给j赋了值为0,所以无论你循环多少次,他都是0如果你用j= ++j;这样就是先加后赋值,就是100了
      

  2.   


    那么为什么j++的j自增后没有反映到int j的j去呢?  
      

  3.   


    java中对基本类型是用的值传递(既是真实的数值,而不是传递引用/指针的值),
    i=i++,首先计算 i++ 表达式的值,并保存到某个内存地址,当前 i=0; 
    然后自增变量值运算,内存中的i执行递增操作,i=1, 
    然后赋值运算,执行=,从内存地址中获取第一步的计算结果,由于i++的结果是0,所以i又从1变成0
    呵呵,以上仅个人看法,如果有错还望多多指正
      

  4.   

    j最后的赋值为0  最后的变量j和j++的那个j没关系了
      

  5.   

    我表示我是复制粘贴过来的
    首先刚开始J = 0 , 在J = J++的时候, 等号前面的那个J已经不是J声名时的那块内存区了,JVM为他重新为他分配一块新的内存区.比如说,int j = 0 时,j的内存地址为00xx01,值为0。那么经过第一循环的以后前面那个J内存地址为00xx02,值为0,而后面那个J(内存地址00xx01)则会进行++操作,此时他的值为1,不过他已经不能影响到前面J的值了,此时J的内存地址就已经是等号前面的那个J的内存地址了(00xx02),再进行第二循环的时候,j的内存地址是:00xx02,值是0,至于00xx01那块内存区域,因为已经没有人再使用,所以将会在下一次垃圾回收的时候被GC回收,此时他(内存地址为00xx02的J)变成后面的那个j,前面那个J 则又会重新分得一块新的内存区域00xx03,值仍然是0,而00xx02则又会被丢弃然后被GC回收,依此类推,直至最后打印时J仍然为0,但他的内存地址已经不是最开初的00xx01了,换句话说,他已经不是当初的那个J了。
      

  6.   

    没粘好首先刚开始J = 0 , 在J = J++的时候, 等号前面的那个J已经不是J声名时的那块内存区了,JVM为他重新为他分配一块新的内存区.比如说,int j = 0 时,j的内存地址为00xx01,值为0。那么经过第一循环的以后前面那个J内存地址为00xx02,值为0,而后面那个J(内存地址00xx01)则会进行++操作,此时他的值为1,不过他已经不能影响到前面J的值了,此时J的内存地址就已经是等号前面的那个J的内存地址了(00xx02),再进行第二循环的时候,j的内存地址是:00xx02,值是0,至于00xx01那块内存区域,因为已经没有人再使用,所以将会在下一次垃圾回收的时候被GC回收,此时他(内存地址为00xx02的J)变成后面的那个j,前面那个J 则又会重新分得一块新的内存区域00xx03,值仍然是0,而00xx02则又会被丢弃然后被GC回收,依此类推,直至最后打印时J仍然为0,但他的内存地址已经不是最开初的00xx01了,换句话说,他已经不是当初的那个J了。
      

  7.   

    j先取值 然后j++ 然后把先取得值给j赋值回去 从头到尾都没变过
      

  8.   

    http://blog.csdn.net/lywybo/article/details/5189925这篇说的不错
      

  9.   

    因为你的赋值语句 j = j++;这句每次是先赋值后加1,所以这样j相当于永远为0!!!