java中i=i++的問題
最近老是看到問這樣問題的人,來解釋下:
int i = 0; i = i++; 結果還是0 為什麼? 程式的執行順序是這樣的:因為++在後面,所以先使用i,“使用”的含義就是i++這個表示式的值是0,但是並沒有做賦值操作,它在整個語句的最後才做賦值,也就是說在做了++操作後再賦值的,所以最終結果還是0 讓我們看的更清晰點: int i = 0;//這個沒什麼說的 i = i++;//等效於下面的語句: int temp = i;//這個temp就是i++這個表示式的值 i++; //i自增 i = temp;//最終,將表示式的值賦值給i 這是java裡的實現,當然在其他的語言如c或是c++中可能並不是這麼處理的,每種語言都有各自的理由去做相應的處理。 這給我們一個警示:不要在單個的表示式中對相同的變數賦值超過一次 ----------------------------------- 讓我們從位元組碼層次看一看,原始碼如下: public class Test { public static void main(String... args) { int i = 0; i = i++; System.out.println(i); } }
使用javac編譯後再使用javap -c Test反編譯這個類檢視它的位元組碼,如下(只摘取main方法):
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: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 10: iload_1 11: invokevirtual #3; //Method java/io/PrintStream.println:(I)V 14: return
這裡,我從第0行開始分析(分析中【】表示棧,棧的底端在左邊,頂端在右邊): 0:將常數0壓入棧,棧內容:【0】 1:將棧頂的元素彈出,也就是0,儲存到區域性變數區索引為為1(也就是變數i)的地方。棧內容:【】 2:將區域性變數區索引為1(也就是變數i)的值壓入棧,棧內容:【0】 3:將區域性變數區索引為1(也就是常量i)的值加一,此時區域性變數區索引為1的值(也就是i的值)是1。棧內容:【0】 6:將棧頂元素彈出,儲存到區域性變數區索引為1(也就是i)的地方,此時i又變成了0。棧內容:【】 7:獲取常量池中索引為2所表示的類變數,也就是System.out。棧元素:【】 10:將區域性變數區索引為1的值(也就是i)壓入棧。棧元素:【0】 11:呼叫常量池索引為3的方法,也就是System.out.println 14:返回main方法 |
相關文章
- Java中 i=i++ 問題底層原理解析Java
- 關於java中的i++和++iJava
- JAVA的i++, i+=1, i=i+1有區別嗎?Java
- C++中的i++和++i你真的理解嗎?C++
- 圖解i++和++i圖解
- python 中的i++ ,邏輯表示式Python
- synchronized下的 i+=2 和 i++ i++執行結果居然不一樣synchronized
- c語言中i++與++i的使用技巧C語言
- 美團一面問我i++跟++i的區別是什麼
- Java變數自增表示式 i = i++ 的底層邏輯(簡述)Java變數
- jvm是如何執行i = i++ + ++i的,你知道嗎?JVM
- C++複習整理---i++和++iC++
- 位元組碼指令分析 ++i 和 i++
- 一個關於 i++ 和 ++i 的面試題打趴了所有人面試題
- 一道非常棘手的 常見Java 面試題:i++ 是執行緒安全的嗎?Java面試題執行緒
- c# for(int i;i<3;i++)迴圈的執行次序C#
- Java實現-揹包問題IJava
- 每天學點C++知識:用 ++i 替代 i++C++
- 面試題【1】:i++是否原子操作?並解釋為什麼?面試題
- 在XSL裡執行類似for(i=0;i〈x;i++)的迴圈 (轉)
- 面試官又整新活,居然問我for迴圈用i++和++i哪個效率高?面試
- Java中的"+"運算問題Java
- 【筆記】9i 文件中的一個問題筆記
- 好程式設計師web前端教程分享初學者搞懂i++和++i程式設計師Web前端
- java中list的常見問題。Java
- java學習中不懂的問題Java
- C#自增運算子詳解:++i與i++的區別及應用場景C#
- java中的易混問題收集(轉)Java
- jdk1.4 + oracle9i中遇到的漢字問題!!!JDKOracle
- oracle9i + jdk1.4中遇到的漢字問題!!!OracleJDK
- Java在演算法題中的輸入問題Java演算法
- Oracle I/O問題解析Oracle
- 學習Java中遇到的繼承問題Java繼承
- java Gson使用中遇到的Date格式問題Java
- java中關於Map的九大問題Java
- java中synchronized鎖定物件問題Javasynchronized物件
- Java中Socket上的Read操作堵塞問題Java
- 深入分析 Java 中的中文編碼問題Java