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 ,这是为何?
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 ,这是为何?
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 ); 以此推算,希望你明白
关键还是逻辑顺序问题。不放把这里改进以下, 可以看的更清楚: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同等的数值。
假如:a=b++ //是先把b的值赋给a,在b自己加1。相当与a=b再b+1
a=++b //是先执行b+1,然后把b+1的值赋给a,相当与先b+1在a=b+1
LZ自己好好的想清楚!!
实际上问题的关键就是
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
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;
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
// b = (b==0)?a:b++ ;
// b++ 是指b的值在原来基础之上加1,但是加号左右有很大区别,如果是b++意思就是最后加,那么++b就是先加
// 如下:
int a = 0;
System.out.println(++a);
System.out.println(a++);
// 结果是1,0