計算機之因此叫「計算機」,其最基本用途之一就是運算,對應剛剛接觸Java的小夥伴而言,熟悉並掌握Java中的各類運算符及其在表達式中的運算優先級是十分必要的。spa
算術運算主要用來處理數學中的加、減、乘、除四則運算。是最簡單、最經常使用的運算符。3d
1. 除與取模:數據作除法操做時,/ 是求商, % 是取餘數。兩個整數相除獲得的結果是商的整數部分。code
2. 自增與自減:在原數據的基礎上執行加1或減1的操做。blog
//來源:公衆號【時光與字節】 package BaseCode; public class code1_1 { public static void main(String[] args) { int f=7; int n=2; System.out.printf("整數相除:f/n=%d\n",f/n); System.out.printf("小數相除:f/n=%f\n",f/(float)n); //兩個整數相除,只能得到結果的整數部分,不是四捨五入。 //如想結果爲小數,需將其中一個操做數轉換爲浮點數。 System.out.println("取模(求餘數):f%n="+f%n); //自增與自減:單獨使用 f--; ++n; System.out.println("f的值:"+f+", n的值:"+n); //自增與自減:參與操做 int xf=++f;//先自加,再賦值 int yn=n--;//先賦值,再自減 System.out.println("f的值:"+f+", xf的值:"+xf); System.out.println("n的值:"+n+", yn的值:"+yn); //++10 這種寫法是錯誤的,常量不能自增或自減 } }
運行結果數學
整數相除:f/n=3 小數相除:f/n=3.500000 取模(求餘數):f%n=1 f的值:6, n的值:3 f的值:7, xf的值:7 n的值:2, yn的值:3
用於對兩個變量或數值進行比較,不管如何運算,最終結果只能爲true(真)或false(假),切勿將==誤寫爲賦值號=。class
用於對布爾型數據進行操做,其結果仍爲布爾型。基礎
短路運算:以&和&&爲例, | 和 || 是同樣的道理。變量
&和&&都表示與操做,當運算兩邊都爲true時,其結果才爲true。因而,當左邊爲false時,便可肯定結果爲false,右邊是否運算已對結果沒有影響了。擴展
//來源:公衆號【時光與字節】 package BaseCode; public class code1_2 { public static void main(String[] args) { int f = 7; //變量f初始化爲7 int n = 7; //變量n初始化爲7 //【短路與】運算 boolean bf = (f<5) && (f++<9); //【與】運算 boolean bn = (n<5) & (n++<9); System.out.println("短路運算的結果爲:" + bf); System.out.println("f的結果爲:" + f); System.out.println("未短路運算的結果爲:" + bn); System.out.println("n的結果爲:" + n); //n的值變了 } }
運行結果數據類型
短路運算的結果爲:false f的結果爲:7 未短路運算的結果爲:false n的結果爲:8
分析:
bf爲短路與運算的結果,f<5爲假,算式右邊未計算,因此f的值沒有變。
bn是與運算的結果,整個算式都需計算,因此n++被執行了,n自加1。
將常量、變量或是表達式的值賦給一個變量,賦值運算符主要是=(等號)。
擴展賦值運算符(+=,-+,*=,/=,%=):都是將變量與右側操做數進行算術運算,再將結果賦給變量。如:f+=5等同於f=f+5。
1. 一條語句可對多個變量賦值。
int a,b,c; a=b=c=10; //正確寫法 int i=j=k=10; //寫法錯誤
2. 擴展賦值運算隱含了強制類型轉換,看下圖。
上圖的代碼中,n+=x未報錯,但n=n+x報錯了。
兩個short型相加,結果應爲int型。+=賦值符隱含了強制類型轉換,因此沒有錯。
準確的說,n+=x 應該等同於
n=(n的數據類型)(n+x)
位運算:按二進制位進行與、或、非和異或的運算。
移位運算:對二進制位進行左移和右移的操做。
<<左移:左邊最高位丟棄,右邊補0
>>右移:右移一位,左邊空位根據原數的符號補0或1(正數補0,負數補1)
>>>無符號右移:右移一位,左邊空位補0
//來源:公衆號【時光與字節】 package BaseCode; public class code1_4 { public static void main(String[] args) { byte a=6; // 6對應二進制:00000110 byte b=11; // 11對應二進制:00001011 System.out.println("按位與運算:a&b = "+ (a&b));//結果爲:2 System.out.println("左移一位:b<<1 = "+ (b<<1));//結果爲:2 } } // 按位與運算:6%11 左移一位:11<<1 // 00000110 00001011 // & 00001011 <<1 // ---------------- ---------------------- // 00000010 00010110 // 對應數值爲:2 對應數值爲:22
運行結果
按位與運算:a&b = 2 左移一位:b<<1 = 22
條件運算:比較表達式?表達式1:表達式2
執行規則:先計算比較表達式的值,若是爲true,結果爲表達式1;不然,結果爲表達式2。
int x = 59; String s = (x>60) ? "及格" : "不及格" ; System.out.print(s);//結果s的值爲:不及格
一個表達式中出現多個運算符,就有相似「先乘除後加減「這樣的前後問題,一般狀況下:
具體可參看下表,具備高優先級的運算符在表的上面,較低優先級在表的下面。