日期:2014-05-20 浏览次数:20842 次
在我们Java基础中已经知道++ 是自增运算符,–是自减运算符。而且我们知道 i++ 和 ++i 是有区别的,前一个是先运行后自增,后一个是先自增后运算,我们还知道 ++的运算优先级很高,比+高,更比赋值运算符=高。 那么你能回答出下面这道题中i的值是多少吗? 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的值是7 i= 4+6+7 =17;
------解决方案--------------------
y = y++;
执行的过程其实是:
int y = 10;
int t = y;
y++;
y = t;
------解决方案--------------------
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.java C:\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: return public 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.java C:\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: return public static void main(java.lang.String[]); Code: 0: iconst_0 1: istore_1 //初始化 2: iinc 1, 1//自增 5: return }