Java開發筆記(九)賦值運算符及其演化
前面的加減乘除四則運算,計算結果通過等號輸出給指定變量,註意此時代碼把變量放到等號左邊。而在算術課本裏,加法運算的完整寫法類似於“1+1=2”這樣,運算結果應該跟在等號右邊。不過代數課本裏的方程式存在“x=y+1”的寫法,表示等號兩邊的結果數值是一樣的,因此變量放在等號左邊也是可以理解的。然而Java編程裏的“=”並非數學上的相等涵義,而是一種賦值操作,所謂“賦值”,指的是將某一數值賦給某個變量的過程。計算機程序在運行的時候,不管操作什麽類型的數據,都要有處地方保存運算前後的數值。變量在參與計算的時候,它可能存在多種身份,當變量作為運算過程的操作數之時,它保存的是運算前的數值;當變量作為運算結果的輸出數之時,它保存的是運算後的數值。故而等號兩邊同時出現某個變量是完全正常的,就像下面代碼演示的那樣:
// 日常生活中的加法例子是:1+1=2,運算結果在右邊。但Java編程中是把運算結果放在左邊的 int x = 1+1; // 註意這裏的等號是賦值操作,並非代數方程式裏面的等號,否則x=x+7將會求得0=7的荒誕結果 x = x+7;
註意上述演示代碼裏的“x = x+7”,等號的左右兩邊雖然都出現了整型變量x,但是這兩個x所處的時間點不同,使得它們代表的數值也不一樣。等號右邊的x,保存的是運算開始前的變量值,即2;而等號左邊的x,保存的是運算結束後的數值,即9。所以前面的代碼看似代數方程式,其實表示的是一個存在時間先後概念的賦值語句。
就賦值語句“x = x+7”而言,盡管它從數學角度來看很是無理,可是在計算機編程中卻十分常見。該語句僅僅要求給某個整型變量加上若幹數值,並未涉及到其它別的什麽變量,好比某人的背包裏原本裝了三本書,然後往裏面塞兩本書,最終背包一共裝了五本書。由於這種加法運算只對某個變量進行,因此Java又提供了“+=”運算符來簡化變量的自增操作,新運算符的使用代碼示例如下:
// 對變量進行加法運算後,假如相加之和仍然保存在原變量,那麽可按如下格式使用運算符“+=” x += 7; // 該行代碼等同於 x = x+7; System.out.println("相加之和 x="+x);
既然有“+=”開了個自增運算的頭,那麽其它的四則運算依此類推,均可分別演變出自減運算符“-=”、自乘運算符“*=”、自除運算符“/=”,以及對變量自身取余數的運算符“%=”,相應的例子代碼如下所示:
// 運算符“-=”的作用類似“+=”,即把相減之差保存到原變量中 x -= 7; // 該行代碼等同於 x = x-7; System.out.println("相減之差 x="+x); // 若要將相乘之積保存到原變量中,則可使用運算符“*=” x *= 7; // 該行代碼等同於 x = x*7; System.out.println("相乘之積 x="+x); // 若要將相除之商保存到原變量中,則可使用運算符“/=” x /= 7; // 該行代碼等同於 x = x/7; System.out.println("相除之商 x="+x); // 若要將相除之余保存到原變量中,則可使用運算符“%=” x %= 7; // 該行代碼等同於 x = x%7; System.out.println("相除之余 x="+x);
推而廣之,凡是對變量自身進行某種基礎運算,然後運算結果又保存在該變量中,這些情況都適用於擴展了的賦值語句。譬如之前提到的按位左移操作符<<、按位右移操作符>>,均可演化出對應的自身左移運算符“<<=”,以及自身右移運算符“>>=”,這兩個運算符的演示代碼如下:
// 若要將按位左移結果保存到原變量中,則可使用運算符“<<=” x <<= 2; // 該行代碼等同於 x = x << 2; System.out.println("x按位左移兩位="+x); // 若要將按位右移結果保存到原變量中,則可使用運算符“>>=” x >>= 2; // 該行代碼等同於 x = x >> 2; System.out.println("x按位右移兩位="+x);
Java開發筆記(九)賦值運算符及其演化