前面講到賦值運算符的時候,提到「x = x+7」能夠被「x += 7」所取代,固然Java編程中給某個變量自加7並不常見,常見的是給某變量自加1,就像走臺階,通常都是一級一級臺階地走,犯不着一會兒跳上七級臺階。那麼對於變量自加1的狀況,既能夠寫成「x = x+1」,也能夠寫成「x += 1」,可是早期的Java設計師嫌前面的語句不夠簡潔,故而創造了新的運算符「++」,該運算符表示給變量自加1,因而「x += 1」可再簡化爲「x++」。同理,運算符「--」表示給變量自減1,語句「x--」等價於「x -= 1」和「x = x-1」。爲深刻理解「++」與「--」這兩個運算符的做用,不妨運行下面的演示代碼觀察結果:java
int x = 3; System.out.println("初始 x="+x); x++; // 等同於x=x+1或者x+=1 System.out.println("自增1 x="+x); x--; // 等同於x=x-1或者x-=1 System.out.println("自減1 x="+x);
既然有了自增1運算「++」和自減1運算「--」,那末有沒有自乘運算「**」和自除運算「//」呢?很遺憾Java不存在所謂的自乘與自除,假若自乘運算指的是求某整型變量的平方,仍是老老實實地寫如下代碼「x = x*x」或者「x *= x」;假若自除運算指的是求某整型變量的倒數,也要老老實實地寫如下代碼「double y = 1.0/x」。求平方與求倒數的代碼以下所示:編程
// 沒有「**」這個運算符,求平方仍是按照常規寫法 x *= x; // 也能夠寫成x = x*x System.out.println("求平方 x="+x); // 「//」已經被用做註釋標記了,求倒數也得按照常規寫法,並且整數的倒數只能是小數 double y = 1.0/x; // 注意這裏的1.0/x,因爲x是整型數,所以1/x沒法求得小數 System.out.println("求倒數 y="+y);
因爲「++」和「--」從頭至尾只有變量自身參與運算,並沒有其它的操做數,所以又被稱做一元運算符。相似的一元運算符還有負號運算符「-」和正號運算符「+」,這兩個符號其實也來源於數學,都放在數字前面,好比「-1」表示負一,「+1」表示正一。但在Java編程當中,變量前面的正負號概念有所不一樣,例如「-x」指的是對x作負號運算,「x = -x」等價於「x = 0-x」。假若整型變量x原來是正值,則負號運算的結果爲負值;但若x原來是負值,則負號運算的結果變爲正值,也就是所謂的負負得正。至於「x = +x」等價於「x = 0+x」,顯然正號運算的結果與原值相同,正值的正號運算結果仍爲正值,負值的正號運算結果仍爲負值,而非數學上的正號意義。要想驗證上述的正負運算符,可運行下列代碼觀察測試結果。測試
x = -x; // 等同於x=0-x System.out.println("負數 x="+x); x = +x; // 等同於x=0+x System.out.println("正數 x="+x);
注意到上面的正負運算符直接放在變量以前,實際上「++」和「--」也容許放在變量前面,單獨的「++x」等價於「x++」,單獨的「--x」等價於「x--」。之因此特別強調「單獨」二字,是由於一旦它們放到了其餘語句之中,運算結果就將大不相同。譬以下述代碼演示了兩者之間的區別:設計
int y1 = 7; int z1 = y1++; // 後加加操做的優先級較低 System.out.println("z1="+z1); int y2 = 7; int z2 = ++y2; // 前加加操做的優先級較高 System.out.println("z2="+z2);
運行上面的演示代碼,會獲得下面的日誌信息。日誌
z1=7 z2=8
可見此時z1的數值不等於z2,究其緣由,乃是前加加與後加加的運行機制差別所致。對於「int z1 = y1++;」,該語句在執行時會分解成下列兩個步驟:先執行對z1的賦值操做,再執行對y1的自增操做。此時最終的運行步驟如同如下代碼:blog
int z1 = y1; y1 = y1+1;
對於「int z2 = ++y2;」,該語句在執行時也會分解成下列兩個步驟:先執行對y1的自增操做,再執行對z1的賦值操做。此時最終的運行步驟如同如下代碼:數學
y2 = y2+1; int z2 = y2;
其實這種狀況很好理解,計算機語言跟人類文字的書寫順序同樣,都是從上到下、從左往右。定睛一看「x++」,果真先看到變量x,接着纔看到自增運算++;回頭再瞅「++x」,這下先看到自增運算,而後纔看到變量x。同是書面文字,計算機語言和人類語言的語法邏輯大抵相同。
最後來個腦筋急轉彎,現有變量z1值爲7,變量z2值爲8,那麼且看下面代碼的運算結果,變量z3的數值又該爲什麼?有興趣的朋友不妨一試。class
int z3 = ++z1+z2++;