1. 程式人生 > 其它 >JAVA學習日誌:a++和++a有什麼區別?

JAVA學習日誌:a++和++a有什麼區別?

技術標籤:筆記java

JAVA學習日誌:a++和++a有什麼區別?

文章目錄


前言

前言:學習JAVA這門語言將近一年的時間,最近也學到了SpringBoot這個框架,但是也發現自己越來越學不下去了,主要因為自己在學習的過程只追求學習速度而忽略了學習的質量,就像現在雖然可以使用SpringBoot完成一個小專案,但是其中的程式碼質量非常差,用mybatis也只是簡單的使用註解加單表查詢來實現業務邏輯。現在覺得不能這樣學下去,一切框架都是JAVA基礎語言寫出來的,如果只是盲目學習框架而不知其中的含義,這樣的學習方式是在浪費時間,以後新的框架出來自己也會被淘汰,而以後進入社會我可能也不能沉住心思來學基礎。所以現在就決定不繼續學習新的框架,這一年好好複習JAVA語言本身,練練自己的演算法和程式設計規範。


提示:以下均是自己一些見解,如有錯誤感謝指出。

一、編寫案例

首先編寫一個基礎的案例來更直觀的看到兩者之間的區別。

	public class Demo {
    public static void main(String[] args) {
        int n = 7;
        int m = 7;

        int a = n++;
        int b = ++m;

        System.out.println(a);
        System.out.println(b);
    }
}

在這裡插入圖片描述
上面是執行結果,可以看到變數a的值並沒有發生變化,而b的值在原有的基礎上+1了,下面看看編譯後的.class原始碼,就可以很清楚直觀的看到JAVA內部是怎麼進行操作的了。

二、檢視編譯後的.class位元組碼檔案

1.將.class位元組碼檔案在idea中開啟

編譯後的程式碼如下:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

public class Demo {
    public Demo() {			//預設的構造器
    }

    public static void main(String[] var0) {
        byte var1 = 7;				//定義變數
        byte var2 =
7; //定義變數 byte var10000 = var1; //先將var1的值賦值給var10000這個中間變數 int var5 = var1 + 1; //再把var1進行+1的操作 byte var3 = var10000; //把中間變數var10000賦值給var3,也就是把var1+1前的值賦給了新的變數 int var6 = var2 + 1; //先執行+1的操作然後再賦值給新的變數 System.out.println(var3); System.out.println(var6); } }

2.“究極直觀版”的.class位元組碼

上面的程式碼如果看不明白,還不夠直觀,就倆看看下面經過“改造”後的樣子吧~

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

public class Demo {
    public Demo() {			//預設的構造器
    }

    public static void main(String[] var0) {
        int n = 7;				//定義變數
        int m= 7;				//定義變數
        
        int var10000 = n;		//先將n的值賦值給var10000這個中間變數
        int var5 = n + 1;		//再把n進行+1的操作
        int a = var10000;		//然後把中間變數var10000賦值給a,也就是把n原本的值賦給了a,並沒有把n+1後的值賦值給a
        int b = m + 1;			//執行m+1的操作然後直接賦值給b
        
        System.out.println(a);	
        System.out.println(b);
    }
}

上面這段程式碼只是把JAVA編譯後的變數名稱改成了編譯前的變數名,這種辦法並不嚴謹,但是可以更好的對比之前未編譯程式碼,來觀察++a和a++之間的區別了。


總結

int b = ++m :m先自增1,然後再把值賦值給b。
int a = n++ :先把n的值賦值給a,然後再自增1,所以a的值實際上還是n的值,不是n自增後的值。

注意

建議不要在表示式中使用++,因為這樣的程式碼會讓人很困惑,而且會帶來煩人的BUG。