public class Result { 
static int b  ; public static void main(String[] args ){ 
int a = 7 ; 
change( a ); 
change(a ); 
change(a ); 
change(a ); 
} public static void change( int a  ){ b = (b==0)?a:b++ ; 
//b++; 
System.out.print(b+" "); 
//return  b ; 


结果:7 7 7 7 
但是把b++ 改为 ++b 后,输出就是: 7 8 9 10 ,这是为何?

解决方案 »

  1.   

    java中是值传递,a将值传递给方法change,方法change最后返回b的值,a的值没有改变。
      

  2.   

    基本数据类型(int)的默认值是0,这个b = (b==0)?a:b++ ;是运算符优先级,先计算二元运算,在赋值,赋值后如果你b++,或++b,不是改变了这个全局变量的值为a了(a=7),在第二次调用方法时,显然是b==0不会成立,把b++的值赋给了前面的b(b = (b==0)?a:b++ ;)再去+1,所有视乎没有+2,每次调用方法只加了一次。貌似很好理解。。
      

  3.   

    public class Result { 
    static int b  ; public static void main(String[] args ){ 
    int a = 7 ; 
    change( a ); 
    change(a ); 
    change(a ); 
    change(a ); 
    } public static void change( int a  ){ b = (b==0)?a:b++ ; 
    //b++; 
    System.out.print(b+" "); 
    //return  b ; 


    结果:7 7 7 7 
    但是把b++ 改为 ++b 后,输出就是: 7 8 9 10 ,这是为何?
    因为b++是先运算后++,当我们第一次调用change( a ); 时,因为b为true所以b=7.当第二次调用change( a ); 时,b==0为flase.(这里是关键了请注意)执行b=b++时,因为++的优先级高于=,b++得到的值为8放入栈(内存)中。b=b++想相当与b=b,因为b++是先运算后++,这时得到的等号左边的b=7放进内存就覆盖了b++放进内存的值8.而b=++b中的++b是先++后运算,++b得到的值8还是先放进内存,因为++b是先++后运算这时等号右边的b值也为8,放进内存,只是覆盖了++b的值8,
    后面调用change( a ); 以此推算,希望你明白
      

  4.   

    楼上说的很对,这个题目于是否是值传递没有多大关系。
    关键还是逻辑顺序问题。不放把这里改进以下, 可以看的更清楚:public static void change( int a  ){ 
      //定义一个局部变量
      int c = b++;
      b = (b==0)?a:c;
      System.out.print(b+" ");  
    } 这回看, 虽然c=b++运算结束以后, b加1了,但是在 b = (b==0)?a:c 这里又再次被修改为a同等的数值。
      

  5.   

    #5,#6,#7都是对的,就看LZ能不能想通自增“++”这个符号怎么运算的了!!!
    假如:a=b++ //是先把b的值赋给a,在b自己加1。相当与a=b再b+1
    a=++b //是先执行b+1,然后把b+1的值赋给a,相当与先b+1在a=b+1
    LZ自己好好的想清楚!!
      

  6.   

    我也是初学,也说两句,呵呵
    实际上问题的关键就是
    b = b++
    这个语句的执行过程
    我觉得它编译出来的结果应该可以这样表述(tmp 临时变量)
    tmp = b;
    b=b+1;
    b = tmp;
    而b = ++b的结果应该是
    b=b+1;
    tmp=b;
    b = tmp;
    引入一个临时变量似乎就变得清晰了
    我测试了一下
    public class Result {public static void main(String[] args ){
    int a = 7 ;a = a++;int b = 8;
    b = ++b;int c;
    c = b++;
    }}用javap看看这个程序编译生成的字节码反汇编结果吧
    Compiled from "Result.java"
    public class Result extends java.lang.Object{
    public Result();
      Code:
       0:   aload_0
       1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
       4:   returnpublic static void main(java.lang.String[]);
      Code:
       0:   bipush  7
       2:   istore_1
       3:   iload_1
       4:   iinc    1, 1
       7:   istore_1
       8:   bipush  8
       10:  istore_2
       11:  iinc    2, 1
       14:  iload_2
       15:  istore_2
       16:  iload_2
       17:  iinc    2, 1
       20:  istore_3
       21:  return}看看iload 和iinc的顺序
       3:   iload_1
       4:   iinc    1, 1   11:  iinc    2, 1
       14:  iload_2
      

  7.   

    public static void change( int a  ){ b = (b==0)?a:b++ ; 
    System.out.print(b+" "); 

    我认为你是被后面的b的操作再次赋值给b迷惑了
    假如前面的换成c你就不会有疑问了,像这样:
    public static void change( int a  ){ c = (c==0)?a:b++ ; 
    System.out.print(c+" "); //但这样将会和++b的结果一样

    你的代码实际执行的是这样的操作:
    public static void change( int a  )

    c = (c==0)?a:b++ ; 
    b=c;
    System.out.print(b+" ");
    } 关于如果是b的内存操作,你还是看看java的api你就会马上会明白,
    在C++里X++是这样实现的(java是c++的升级版,估计这样的基本算法不会变):
    temp(*this);//copy你所要操作的变量value到另个变量temp中
    value++;//用左++的实现
    return temp;
    结果就像上面说的++的运算优先级大于=的,所以返回的值会把原来++的值覆盖掉,相当于b=b;
      

  8.   

    up,问题的关键就是理解++b,b++及区分全局变量和局部变量的问题
      

  9.   

    其实就是b=b++和b=++b的老问题个人的理解:首先"="赋值运算符的操作是:
    step1:将"="右边的表达式的运算结果保存为在栈里(暂定为temp)
    step2:然后赋值给等式右边的变量在b=b++里,是进行了b的操作之后(step1),然后判断怎么操作,结果因为++优先级大于=,所以执行"b++"。而这时栈里temp是不变的,所以此时b++之后系统里的b=8,temp=7。这时候再把栈里的temp赋给等式左边(step2),就会把b=8覆盖成b=7了。而在b=++b里,则是先执行了"++b"的操作,才进行了step1,所以准备赋给等式右边的栈里的值是8
      

  10.   


    //  b = (b==0)?a:b++ ; 
    //  b++ 是指b的值在原来基础之上加1,但是加号左右有很大区别,如果是b++意思就是最后加,那么++b就是先加
    //  如下:
    int a = 0;
    System.out.println(++a);
    System.out.println(a++);
    //  结果是1,0