語言基礎 3.2.1 算術操作符 這個程序得輸出為: 變量數值... i = 37 j = 42 x = 27.475 y = 7.22 加... i + j = 79 x + y = 34.695 減... i - j = -5 x - y = 20.255 乘... i * j = 1554 x * y = 198.37 除... i / j = 0 x / y = 3.8054 計算余數... i % j = 37 x % y = 5.815 混合類型... j + y = 49.22 i * x = 1016.58 這里注重,當一個整數和一個浮點數用為運算符來執行單一算術操作的時候,結果為浮點型。整型數是在操作之前轉換為一個浮點型數的。下面的表總結了根據運算對象的數據類型由算術操作符返回的數據類型。它們是在操作執行之前進行數據轉換的 除了雙元的運算符+和-,還有以下單元運算符: 另外兩個簡練的算術操作符為++和--。++是完成自加1的作用;而—是完成自減的作用。不管是++還是—都可能出現在運算對象的前面(前綴)或者后面(后綴),但是它們的作用是不一樣的。前綴的格式為:++op或--op,它實現了在加/減之后才計算運算對象的數值;而后綴的格式為:op++或op--,它實現了在加/減之前就計算運算對象的數值。 下面的程序SortDemo中使用兩次++和一個--,如下: public class SortDemo { public static void main(String[] args) { int[] arrayOfInts = { 32, 87, 3, 589, 12, 1076, 2000, 8, 622, 127 }; for (int i = arrayOfInts.length; --i >= 0; ) { for (int j = 0; j < i; j++) { if (arrayOfInts[j] > arrayOfInts[j+1]) { int temp = arrayOfInts[j]; arrayOfInts[j] = arrayOfInts[j+1]; arrayOfInts[j+1] = temp; } } } for (int i = 0; i < arrayOfInts.length; i++) {
System.out.PRint(arrayOfInts[i] + " "); } System.out.println(); } } 這個程序將10整型數值放置在一個數組arrayOfInts中。這個程序使用了arrayOfInts.length來獲得數組中的元素個數。單個的元素可以由arrayOfInts[index]來訪問,這里index是一個整型數,它指示數組中元素的位置。這里一定要注重index的下標是從0開始的。 這個程序的作用是輸出從小到大的10個整數,結果為: 3 8 12 32 87 127 589 622 1076 2000 還是讓我們好好看看這個SortDemo程序是怎樣工作的。下面是控制外部循環的語句: for (int i = arrayOfInts.length; --i >= 0; ) { ... } 這個for語句是一個循環結構。其中--i >= 0給出了循環的條件,即--i大于等于0就繼續循環,一旦小于0就結束循環。使用前綴--意味著最后的一次循環迭代是發生在當i等于0的時候。假如我們改變改變一下使用后綴的,那么循環迭代的最后一次發生在當i等于-1的時候,這樣就會發生錯誤,因為數組的下標是從0開始的,-1是一個無效的數組下標。 程序中其它兩個循環使用了后綴的++。在兩個例子中,使用前綴或者后綴是沒有問題的。當其中一個運算符號返回的數值沒有用到,則約定使用后綴的。 下面的表格總結自增/自減運算符: 3.2.2 關系與條件運算符 關系運算符是比較兩個數值并決定它們的關系。比如!=在假如兩個運算對象不相等的情況下返回true。以下這個表格總結了關系運算符: 接下來介紹一個例子RelationalDemo。 3.2.2 關系與條件運算符 下面是一個例子RelationalDemo,它定義了三個整型數并且使用關系運算符來比較它們,如下: public class RelationalDemo { public static void main(String[] args) { //定義幾個數 int i = 37; int j = 42; int k = 42; System.out.println("變量數值..."); System.out.println(" i = " + i); System.out.println(" j = " + j); System.out.println(" k = " + k); //大于 System.out.println("大于..."); System.out.println(" i > j = " + (i > j)); //false System.out.println(" j > i = " + (j > i)); //true System.out.println(" k > j = " + (k > j)); //false, they are equal //大于等于 System.out.println("大于等于..."); System.out.println(" i >= j = " + (i >= j)); //false System.out.println(" j >= i = " + (j >= i)); //true System.out.println(" k >= j = " + (k >= j)); //true //小于 System.out.println(小于..."); System.out.println(" i < j = " + (i < j)); //true System.out.println(" j < i = " + (j < i)); //false System.out.println(" k < j = " + (k < j)); //false //小于等于 System.out.println("小于等于..."); System.out.println(" i <= j = " + (i <= j)); //true System.out.println(" j <= i = " + (j <= i)); //false System.out.println(" k <= j = " + (k <= j)); //true //等于 System.out.println("等于..."); System.out.println(" i == j = " + (i == j)); //false System.out.println(" k == j = " + (k == j)); //true //不等于 System.out.println("不等于..."); System.out.println(" i != j = " + (i != j)); //true System.out.println(" k != j = " + (k != j)); //false }程序的輸出為: 變量數值... i = 37 j = 42 k = 42 大于... i > j = false j > i = true k > j = false 大于等于... i >= j = false j >= i = true k >= j = true 小于... i < j = true j < i = false k < j = false 小于等于... i <= j = true j <= i = false k <= j = true 等于... i == j = false k == j = true Not equal to... i != j = true k != j = false } 關系運算符經常用在條件運算符中來構造更復雜的判定表達式。java變成語言支持六種條件運算符:五個雙元運算符和一個單元運算符,如下表所示; &&運算符可以完成條件AND的操作。你可以使用兩個不同的關系運算符和&&來決定是否兩個關系都為true。下面的一行代碼使用了這個技術來決定是否數組的索引處在兩個邊界之間。它決定了是否索引都大于等于0并且小于等于NUM_ENTRIES(它是在之前被定義為常數)。 0 <= index && index < NUM_ENTRIES 這里注重在一些實例中,第二個運算對象可能不用運算,因為假如第一個運算對象是false,則結果就一個是false,因此不用在計算第二個運算對象了。你看看以下的代碼: (numChars < LIMIT) && (...) &&運算符只有在兩個運算對象都為true的時候,才返回true。因此,假如numChars大于等于LIMIT的時候,&&左邊的運算對象就為false,這時就不用在計算右邊的運算對象就返回了數值false。在這個例子中,編譯器將不會計算右邊的運算對象。假如右邊運算對象有副效應的的話(比如讀一個流、更新一個數值或者進行一個計算)這個有重要的含義。 當兩邊的運算對象都是boolean(布爾型),運算符號&跟&&執行相同運算。但是,&總是要計算兩邊的運算對象然后再在兩個運算對象同為true的時候才返回true。同樣地,當運算對象都為boolean(布爾型)的時候,執行與操作符號一樣的功能。這個運算符總是要計算兩邊的運算對象然后在最少有一邊為true的時候才返回true。當它們的運算對象為數字的時候,& 和是按位操作的。 3.2.3 移位和邏輯運算符 移位運算符通過對第一個運算對象左移或者右移位來對數據執行位操作。下面的這個表總結了JAVA編程語言中有效的移位運算符。 每一個運算符移動左邊的運算對象的位數都是由右邊的運算符給出的。這個移位的方向取決于運算符本身。比如,下面的語句是實現將整數13右移1位的目的: 13 >> 1; 13的二進制為1101.右移一位的結果為110,即為十進制的6.左邊的位用零來填充。下面的表給出了JAVA編程語言提供的四種運算符來對它們的運算對象執行按位操作: 當它的運算對象為數字的時候,&運算符為每一個運算對象的每位執行按位AND功能。AND在運算對象的相應位為1的時候結果才為1,其余情況結果都為0,如下表所示: 假如你要對數13和12作AND操作,比如13&12。運算的結果為12,因為12的二進制為1100,遙13的二進制為1101,具體運算過程如下所示: 1101 //13 & 1100 //12 ------ 1100 //12 假如兩個運算對象都為1,AND的結果就為1,或者結果就為0。因此,當你對兩個運算對象執行AND操作的時候,你可以看到左邊的兩位結果位1,而右邊兩位的結果為0。當兩個操作對象都位數字的時候,操作符執行或操作,而^執行異或操作?;虿僮魇钦f只要