From Gossip@caterpillar

Java Gossip: 遞 增、遞減運算

遞增、遞減與指定運算子,老實說常成為初學者的一個惡夢,因為有些程式中若寫得精簡,這幾個運算子容易讓初學者搞不清楚程式的真正運算結果是什麼;事實 上,使用這幾種運算子的目的除了使讓程式看來比較簡潔之外,還可以稍微增加一些程式執行的效率。

在程式中對變數遞增1或遞減1是很常見的運算,例如:
int i = 0;
i = i + 1;
System.out.println(i);
i = i - 1;
System.out.println(i);

這段程式會分別顯示出1與0兩個數,您可以這麼寫這個程式:
int i = 0;
System.out.println(++i);
System.out.println(--i);

其中寫在變數 i 之前的++--就是「遞 增運算子」(Increment operator)「遞減運算子」(Decrement operator),當它們撰寫在變數之前時,其作用就相當於將變數遞增1與遞減1:
++i;    // i = i + 1;
--i;      // i = i - 1;

您可以將遞增或遞減運算子撰寫在變數之前或變數之後,但其實兩者是有差別的,將遞增(遞減)運算子撰寫在變數前時,表示先將變數的值加(減)1,然後再傳 回變數的值,將遞增(遞減)運算子撰寫在變數之後,表示先傳回變數值,然後再對變數加(減)1,例如:
int i = 0;
int number = 0;
number = ++i;   // 相當於i = i + 1; number = i;
System.out.println(number);
number = --i;    // 相當於i = i - 1; number = i;
System.out.println(number);

在這段程式中,number的值會前後分別顯示為1與0,再看看下面這段:
int i = 0;
int number = 0;
number = i++;    // 相當於number = i; i = i + 1;
System.out.println(number);
number = i--;     // 相當於 number = i; i = i - 1;
System.out.println(number);

在這段程式中,number的值會顯示前後分別為0與1。

接下來看「指定運算子」(Assignment operator), 到目前為止只看過一個指定運算子,也就是(=)這個運算子,事實上指定運算子還有以下的幾個:

運 算子 範 例 結 果
+= a += b a = a + b
-= a -= b a = a - b
*= a *= b a = a * b
/= a /= b a = a / b
%= a %= b a = a % b
&= a &= b a = a & b
|= a |= b a = a | b
^= a ^= b a = a ^ b
<<= a <<= b a = a << b
>>= a >>= b a = a >> b

每個指定運算子的作用如上所示,但老實說若不是常寫程式的老手,當遇到這些指定運算子時,有時可能會楞一下,因為不常用的話,這些語法並不是那麼的直覺。

使用++、--或指定運算子,由於程式可以直接在變數的記憶體空間中運算,而不用取出變數值、運算再將數值存回變數的記憶體空間,所以可以增加運算的效 率,但以現在電腦的運算速度來看,這一點的效率可能有些微不足道,除非您這類的運算相當的頻繁,否則是看不出這點效率所帶來的改善,就現在程式撰寫的規模 來看,程式的易懂易讀有時反而是重點,可以的話儘量將程式寫的詳細一些會比較好,千萬不要為了賣弄語法而濫用這些運算子。