j = j++; 
从 = 右边开始看 j 先将自己的值0 赋给左边的j ,然后右边的j 自己再++,此时的j=1,但对于左边的j 没有影响,左边的还是 0
这样,每次循环开始的时候,j 都是0
楼主可以换 j= ++j; 这样会有不同的答案,楼主试试
j++ 先做运算 j 后加1
++j j 先加 1 然后做运算 

解决方案 »

  1.   

    我想 楼上说的不对  因为   j = (j++) + 5 + 3 -8; 还是会得到0  ,所以 他一开始并没有将0赋值给 j。我们应该可以猜测而得出 :j++ 会 先复制 j 的值 到操作数栈  然后++  出栈到局部变量所以说在计算   (j++) + 5 + 3 -8 的时候 其实有俩个 j  ,一个是 0(存在于 操作数栈)  一个是1(存在于局部变量中)(j++) + 5 + 3 -8 的计算结果是 0 ,会再次的保存到局部变量中
    所以说 有两个j   并进行了两次赋值(一次是++ 完成的   一次是 = 完成的)我说的明白吗(操作数栈  :可以想想 CPU 中的浮点运算单元 FPU)
      

  2.   

    参考http://blog.sina.com.cn/s/blog_605f5b4f0100khy0.html
    c++和java处理方式差别很大
    个人觉得最好分开写,这种写法完全是为了考试用的
      

  3.   

    楼上说的都挺有意思的;作为初学者, i++和++i是避免不了的问题;楼主可以猜猜答案:i = 1;
    j = 1;
    i = i ++ + + j;
    System.out.println(i);

    i = 1;
    j = 1;
    i = i ++ + + + j;
    System.out.println(i);i = 1;
    j = 1;
    i = i + ++ j;
    System.out.println(i);

    i = 1;
    j = 1;
    i = i + + ++ j;
    System.out.println(i);
    java中的++还是比较有意思的;PS:可能和楼主的题目有些出入;
      

  4.   

    package com.shizongger;public class Plus { public static void main(String[] args) {
    int j = 0;
            for (int i = 0; i < 10; i++) {
                 //j = j++;
             j++;
                System.out.println(j);
            } }}输出结果:1到10,,,表示不解中!!!
      

  5.   

    j=j++
    先取出j的值为0,然后再把j值加1,然后把刚才取得的0重新赋值给j,最终j还是0.
      

  6.   

    public class TestJ {
    public static void main(String[] args) {
    int j = 0;
            for (int i = 0; i < 10; i++) {
                 j = j++;
                System.out.println(j);
            }
    }
    }你这里j=j++;是这样的计算的,j先等于j,即等于0,每次循环j都等于0。而后面的++是对0进行了加1。所以结果还是0.
    你改成下面的代码即可:
    public class TestJ {
    public static void main(String[] args) {
    int j = 0;
            for (int i = 0; i < 10; i++) {
                 j = ++j;
                System.out.println(j);
            }
    }
    }
      

  7.   

    j=j++的执行顺序是这样的:
    先将j的值作为j++这个表达式的值,然后j自加1,最后将表达式j++的值赋值给j,因为表达式j++的值为0,所以j又变成了0。
    楼主可以改成j=++j。
      

  8.   


    //后++是指表达式的值不变,变量本身的值+1
    //j++是个表达式,你将表达式的值赋给j,所以j没有变,还是原来的值
      

  9.   

    结果肯定是十个0   不用解释,你这里的代码虽然是一句j=j++;
    但是你知道计算机在干什么吗?  进行了很多步,如下:
    第一步计算j++的值得到0,第二步j自增1变成1,第三步把第一步的值赋值给j,j又变成0;
      

  10.   

    后++运算,首先取变量的值作为表达式的值,然后作自增运算。j = j++;
    分为三步运算:
    1)取 j 的值作为表达式 j++ 的值,为 0;
    2) j 作自增运算,此时 j 为 1,但表达式 j++的值依然为0;
    3)将表达式 j++ 的值赋给 j,所以 j 又变成了0。
      

  11.   

    这个问题。。因为你给j 赋值了0,运行时先运行++,然后在赋值给j,所以这样j就一直是0啊,你这样循环是没意思的
      

  12.   

    我应该感谢扔板砖的  因为他至少看了一下我发的帖子至于其他的人  好像连看都没有看我明白了一个道理 :倾听 好像 比 诉说 更有意义
    关于论据 ,我没有 。不过 我可以直接给你答案 :import java.util.Scanner;public class java {    public static void main(String [] args){
        int j = 0;
        j = j++ + 5 - 3 - 2  ;
        System.out.println(j);}
    }Compiled from "java.java"   用javap -c java.class 得到字节码
    public class java {
      public java();
        Code:
           0: aload_0       
           1: invokespecial #1                  // Method java/lang/Object."<init>":()V
           4: return        
        LineNumberTable:
          line 4: 0  public static void main(java.lang.String[]);
        Code:
           0: iconst_0          // 常量0  压入操作数栈
           1: istore_1           // 保存到局部变量
           2: iload_1            // 将局部变量的值  压入操作数栈 (应该可以猜到 上面的 store 会弹出栈)
           3: iinc          1, 1   // 关键的就是这一句  我也不知道是什么意思
                                         //(可以看看 虚拟机规范  可以猜到的是 他不会改变栈 但是能改变局部变量)
           6: iconst_5      
           7: iadd           // + 5
           8: iconst_3      
           9: isub          // -3
          10: iconst_2      
          11: isub          //-2
          12: istore_1    // j = 表达式  下面的就是调用 println  了
          13: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
          16: iload_1       
          17: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
          20: return        
        LineNumberTable:
          line 7: 0
          line 8: 2
          line 9: 13
    }