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
- 關於 i=i++ 問題、入棧順序
- C++中的i++和++i你真的理解嗎?C++
- synchronized下的 i+=2 和 i++ i++執行結果居然不一樣synchronized
- i++引發的慘案
- 你真的懂 i++ 和 ++i 嗎?
- 美團一面問我i++跟++i的區別是什麼
- Java變數自增表示式 i = i++ 的底層邏輯(簡述)Java變數
- jvm是如何執行i = i++ + ++i的,你知道嗎?JVM
- 位元組碼指令分析 ++i 和 i++
- C++複習整理---i++和++iC++
- 一個關於 i++ 和 ++i 的面試題打趴了所有人面試題
- 你真的瞭解 i++, ++i 和 i+++++i 以及 i+++i++ 嗎?
- 一道非常棘手的 常見Java 面試題:i++ 是執行緒安全的嗎?Java面試題執行緒
- 面試官又整新活,居然問我for迴圈用i++和++i哪個效率高?面試
- Java中的"+"運算問題Java
- 不同的子序列問題I
- java學習中不懂的問題Java
- java中list的常見問題。Java
- 好程式設計師web前端教程分享初學者搞懂i++和++i程式設計師Web前端
- C#自增運算子詳解:++i與i++的區別及應用場景C#
- Java在演算法題中的輸入問題Java演算法
- 學習Java中遇到的繼承問題Java繼承
- Leetcode刷題中關於java的一些小問題LeetCodeJava
- Byteman 讓 i++ 百分百執行緒不安全執行緒
- 【Java面試高頻】i++和++i的區別,單例模式的多種實現以及區別,類和例項初始化順序,不看血虧Java面試單例模式
- 能幫你解決90%以上Java面試中的鎖問題(Java中的鎖)Java面試
- java中亂碼問題解決方法Java
- Java中的深淺拷貝問題,你清楚嗎?Java
- Java中關於二分查詢的問題Java
- 總結Java開發面試常問的問題,持續更新中~Java面試
- java學習中問題與解決方式Java
- 工作中碰到的Java問題整理及解決方案Java
- 關於Java中分層中遇到的一些問題Java
- 分享Java面試中的幾個重要基礎問題!Java面試
- Java面試中與原始碼有關的問題分享Java面試原始碼
- 監控報I/O問題,怎麼辦?
- Redis中的問題Redis