原代码如下:
int a = 10;
a = a++;
System.out.println(a);想请问大家,这里的a为什么等于10,这可能是个很简单的问题,但还是希望知情的朋友能够仔细地把原理讲给在下听,因为实在有点想不通,谢谢!
int a = 10;
a = a++;
System.out.println(a);想请问大家,这里的a为什么等于10,这可能是个很简单的问题,但还是希望知情的朋友能够仔细地把原理讲给在下听,因为实在有点想不通,谢谢!
view sourceprint?
01 public class Test { 02 public static void main(String[] args) { 03 04 int i = 1; 05 i = i++; 06 i = i++ + ++i; 07 i = i++ + ++i + ++i; 08 09 System.out.println("i=" + i); 10 } 11 } 如果你的答案是17,那么你就可以不看本文了,否则的话还是有必要看一看的:第五行,i =i++; i++表达式值是1,i的值是2,把i++表达式的值赋值给i,于是i的值又变成了1, OK我们知道第五行过后i的值是1;第六行,i = i++ + ++i; 从优先级上看,两个++优先级最高,+优先级次之,再然后是赋值运算符。两个++相比,第一个先执行。此时 i++ 表达式的值是1,i的值是2,然后再执行++i,++i表达式的值是3, i的值也是3; 然后运算+,1+3 =4,把4赋值给 i ;此时 i 的值是4;第七行,i++ 表达式的值是4,i的值是5++i 表达式的值是6,i的值是6++i 表达式的值是7,i的值是7i= 4+6+7 =17;
第五行,i =i++; i++表达式值是1,i的值是2,把i++表达式的值赋值给i,于是i的值又变成了1, OK我们知道第五行过后i的值是1;这句话的意思是不是指其实这个地方的i++并没有实质的作用,i=i++这句话的执行过程是:先是i++,然后赋值,但是,i++的结果是1,而2并没有得以赋值给i,就像被屏蔽了一样
可以这样理解吗?
int y = 10;
int t = y;
y++;
y = t;
i = 1;
i = i++;
//1.将i的值(1)存入寄存器register1;
//2.将i在内存中的地址存入寄存器register2;
//3.将register2中所存储地址的变量(variable i)增加1;此时i为2
//4.将register1中的值(value)赋给i,此时i变为1.
C:\Users\hp\Desktop\test\a\postfixincrement>type Test.java
public class Test{
public static void main(String[] args){
int i = 0;
i = i++;
}
}
C:\Users\hp\Desktop\test\a\postfixincrement>javac Test.javaC:\Users\hp\Desktop\test\a\postfixincrement>javap -c Test
Compiled from "Test.java"
public class Test extends java.lang.Object{
public Test();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: returnpublic static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1 //完成变量显式初始化
2: iload_1 //变量值进栈
3: iinc 1, 1 //变量自增
6: istore_1 //值出栈 完成赋值
7: return}
C:\Users\hp\Desktop\test\a\postfixincrement>type Test2.java
public class Test2{
public static void main(String[] args){
int i = 0;
i++;
}
}
C:\Users\hp\Desktop\test\a\postfixincrement>javac Test2.javaC:\Users\hp\Desktop\test\a\postfixincrement>javap -c Test2
Compiled from "Test2.java"
public class Test2 extends java.lang.Object{
public Test2();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: returnpublic static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1 //初始化
2: iinc 1, 1//自增
5: return}