1. 程式人生 > 其它 >第三章、運算子

第三章、運算子

第三章、運算子

一、算數運算子

關鍵點:除法,求餘,自增自減

  • 算數運算子一覽:

    運算子 運算 範例 結果
    + 正號 +7 7
    - 負號 -7 -7
    + 9+9 18
    - 10-8 2
    + 字串拼接 "He"+"llo" "Hello"
    * 7*8 56
    / 9/9 1
    % 取模(求餘) 11%9 2
    ++ 自增(前):先運算後賦值
    自增(後):先賦值後運算
    a=2; b=++a;
    a=2;b=a++;
    a=3;b=3,
    a=3;b=2;
    -- 自減(前):先運算後賦值
    自減(後):先賦值後運算
    a=2;b=--a;
    a=2;b=a--;
    a=1;b=1;
    a=1;b=2;
  • 除法運算子

    System.out.println(10 / 4);//數學上來看輸出2.5,實際輸出2,因為整數型別運算得到的結果還是整數,造成了精度缺失。
    System.out.println(10.0 / 4);//輸出2.5 
    double 10/4; // 得到的是2.0
    
  • 求餘運算子

    本質:a % b = a - (int )a / b * b

    System.out.println(10 % 3);//1 。 10 - 10 / 3 * 3 = 1 
    System.out.println(-10 % 3);//-1。 -10 - (-10 / 3) * 3 = -1
    System.out.println(10 % -3);//1。 10 - (10 / -3) * (-3) = 1 
    System.out.println(-10.5 % 3);//-1.5
    //注意:有小數的運算,得到的結果是近似值
    

    應用:求一個四位數每一位上的數字。

    import java.util.Scanner;
    public class TestOpe02{
        public static void main(String[] args){
            //實現功能:任意給出一個四位數,求出每一位上的數字並輸出
            //1.給出任意一個四位數:
            Scanner input = new Scanner(System.in);
            int num = input.nextInt();
            //2.求出每位上的數字:
            //個位數:
            int num1 = num%10;
            //十位數:
            int num2 = num/10%10;
            //百位數:
            int num3 = num/100%10;
            //千位數
            int num4 = num/1000%10;
            //輸出每位上的數字
            System.out.println("個位數:"+num1);
            System.out.println("十位數:"+num2);
            System.out.println("百位數:"+num3);
            System.out.println("千位數:"+num4);
        }
    }
    
  • 自增(自減)運算子

    • 作為獨立語句使用

      獨立使用時,前++與後++是 完全等價的

      int i = 10;
      i++;//i=11
      ++i;//i=12
      System.out.println("i=" + i);//12
      
    • 作為表示式使用

      作為表示式使用時:

      ++i:先自增後參與運算

      i++:先參與運算後自增

      個人理解:二者的區別在於語句:i = i + 1;的執行位置,++在前該語句最先執行,++在後該語句最後執行。

      int i = 8;
      int k = ++i;//先做i = i + 1再做k = i
      System.out.println("i=" + i + "k=" + k);//i = 9, k = 9
      int j = 8;
      int m = ++i;//先做m = j 在做j = j+1
      System.out.println("i=" + i + "k=" + k);//j = 9, k = 8
      
      //將++參與到運算中:
      //規則:++在後:先運算,後加一,++在前,先加一,後運算。
      a = 5;
      int m = a++ + 7;
      System.out.println(m);// 12
      System.out.println(a);// 6
      a = 5;
      int n = ++a + 7;
      System.out.println(n);// 13
      System.out.println(a);// 6
      

      無論這個變數是否用於運算,只要自加最終都會+1。

練習題:

  1. i 等於多少?

    int i = 1;//i = 1
    i = i++; //計算機在做此類自己給自己賦值的運算是會啟用臨時變數temp,(1)temp = i; (2)i = i + 1; (3)i = temp;
    

    最後結果為:1

  2. i 等於多少?

    int i = 1;//i = 1
    i = i++; //與上面順序不同(1)i = i + 1; (2)temp = i(3)i = temp;
    

    最後結果:2

  3. (1) 假如還有59天放假,問:合多少星期零多少天
    (2) 定義一個變數儲存華氏溫度,華氏溫度轉換攝氏溫度的公式為
    5/9*(華氏溫度-100),請求出華氏溫度對應的攝氏溫度。

    public static void main(String[] args) {
    
    		//1.需求:
    		//假如還有59天放假,問:合xx個星期零xx天
    		//2.思路分析
    		//(1) 使用int 變數 days 儲存 天數
    		//(2) 一個星期是7天 星期數weeks: days / 7 零xx天leftDays days % 7
    		//(3) 輸出
    
    		//3.走程式碼
    		int days = 59;
    		int weeks = days / 7;
    		int leftDays = days % 7;
    		System.out.println(days + "天 合" + weeks + "星期零" 
    			+ leftDays + "天");
        //-----------------------------------------------------------------------
            //1.需求
    		//定義一個變數儲存華氏溫度,華氏溫度轉換攝氏溫度的公式為
    		//:5/9*(華氏溫度-100),請求出華氏溫度對應的攝氏溫度
    		//
    		//2.思路分析
    		//(1) 先定義一個double huaShi 變數儲存 華氏溫度
    		//(2) 根據給出的公式,進行計算即可5/9*(華氏溫度-100)
    		//    考慮數學公式和java語言的特性
    		//(3) 將得到的結果儲存到double sheShi
    		//3.走程式碼
    		double huaShi = 1234.6;
    		double sheShi = 5.0 / 9 * (huaShi - 100);
    		System.out.println("華氏溫度" + huaShi 
    			+ " 對應的攝氏溫度=" + sheShi);
    	}
    }
    

二、關係運算符

  • 關係運算符一覽

    運算子 運算 範例 結果
    == 相等於 8 == 7 false
    != 不等於 8 != 7 true
    < 小於 8 < 7 false
    > 大於 8 > 7 true
    <= 小於或等於 8 <= 7 false
    >= 大於或等於 8 >= 7 true
    instanceof 檢查是否是類的物件 "Hello" instanceof String true
  • 注意

    1. 關係運算符的結果都是boolean型別,要麼是true要麼是false
    2. 關係運算符組成的表示式,我們稱為關係表示式
    3. 比較運算子“=="不是"="
  • 案例:

    public class TestOpe08{
        public static void main(String[] args){
            //關係運算符的最終結果,ture or false.
            System.out.println(4>9); // false
            System.out.println(4<9); //true
            System.out.println(4>=9); //false
            System.out.println(4<=9);//true
            System.out.println(4==9);//false
            System.out.println(4!=9);//true
        }
    }
    

三、邏輯運算子

用於連線多個 條件(多個關係表示式),最終的結果是一個boolean值

分為兩組學習:

  1. 短路與"&&",短路或"||",取反!
  2. 邏輯與"&",邏輯或"|",邏輯異或"^"
  • 邏輯運算子一覽

    a b a&b a&&b a|b a||b !a a^b
    true true true true true true true true
    true false false false true true false true
    false true false false ture true true true
    false false false false false false true false
  • 運算規則:

    1. 邏輯與"a&b":當a和b同時為true的時候結果為true,否則為false
    2. 短路與”a&&b“:當a和b同時為true的時候結果為true,否則為false,會發生短路現象
    3. 邏輯或”a|b“:當a和b有一個為true的時候結果為true,二者都為false結果為false
    4. 短路或“a||b”:當a和b有一個為true的時候結果為true,二者都為false結果為false,會發生短路現象
    5. 取反"!a":當a為true,則結果為false,當a為false結果為true
    6. 邏輯異或“a^b”:當a和b不同時,結果為true,否則為false
  • “&&”和"&"的使用區別:

    1. "&&"短路與:如果第一個條件為false,則第二個條件不會判斷,其對應的語句也不會執行,最終結果為false,效率高
    2. "&"邏輯與:不管第一個條件是否為false,第二個條件都要判斷,效率低。
    3. 開發中,基本都使用短路與
    //短路與
    int i = 8;
    System.out.println((5 > 7) && (i++ == 2));//false
    System.out.println(i);//8,第一個的表示式為false後面,第二個表示式不再做
    //邏輯與
    int i = 8;
    System.out.println(( 5 > 7)&&(i++ == 2));//false
    System.out.println(i);//8
    
  • “||"和"|"的使用區別:

    1. ”||“短路或:如果第一個條件為true,則第二個條件不判斷。效率高。
    2. "|"邏輯或:不管第一個是否為true,兩個條件都要判斷。效率低。
    3. 開發中常用短路或

四、位運算子

原碼、反碼、補碼

對於有符號的數而言:

  1. 二進位制的最高位是符號位:0表示整數,1表示負數
  2. 正數的原碼,反碼,補碼都一樣(正數三碼合一)
  3. 負數的反碼=它的原碼除了符號位不變,其他位取反
  4. 負數的補碼=它的反碼+1,負數的反碼=它的補碼-1
  5. 0的反碼,補碼都是0
  6. java中沒有無符號數,換言之,java中的數都是有符號的
  7. 計算機運算的時候,都是以補碼的方式運算的。
  8. 當我們看運算結果的時候,要看它的原碼

位運算子

  • 運算規則:

    1. 按位與"&":兩位全為1,結果為1,否則為0.

      System.out.println(2&3);//2
      /*
      過程:
      1.計算機運算都是按照補碼運算的。
      2的原碼:00000000 00000000 00000000 00000010
      2的補碼:00000000 00000000 00000000 00000010
      3的原碼:00000000 00000000 00000000 00000011
      3的補碼:00000000 00000000 00000000 00000011
      00000000 00000000 00000000 00000010
      00000000 00000000 00000000 00000011  &
      00000000 00000000 00000000 00000010  
      2.我們看結果要看他的原碼
      00000000 00000000 00000000 00000010的原碼為00000000 00000000 00000000 00000010
      所以結果:2
      */
      
    2. 按位或"|":兩位有一個為1,結果為1,否則為0.

    3. 按位異或"^":兩位一個為0,一個為1,結果為1,否則為0.

    4. 按位取反"~":0->1 ,1->0

      System.out.println(~-2);//1
      /*
      過程:
      1.得到-2的原碼:10000000 00000000 00000000 00000010
      2.得到-2的補碼:11111111 11111111 11111111 11111110
      3.取反操作:00000000 00000000 00000000 00000001
      4.將補碼換成原碼:00000000 00000000 00000000 00000001 結果為1
      */
      
    5. 算數右移">>":低位溢位,符號位不變,並用符號位補溢位的高位。

      int a = 1 >> 2;
      // 00000001 -> 00000000 本質: 1 / 2 / 2 = 0,移動一位相當於除了一個2
      
    6. 算數左移"<<":符號位不變,低位補0。

      int c = 1 << 2;
      //00000001 -> 00000100 本質: 1 * 2 * 2 = 4,移動移位相當於乘了一個2
      
    7. 邏輯右移(無符號右移)">>>":低位溢位,高位補0

    8. 特殊說明:沒有""<<<""符號

  • 思考:
    4×8最快的方式:
    4<<3

五、賦值運算子

賦值運算子就是將某個運算後的值,賦給指定的變數。

賦值運算子的分類:

  • 基本賦值運算子"=": int a = 10;
  • 複合賦值運算子:+= -= *= /=……
    例如:a += 1 等價於:a = a + 1;
  • 賦值運算子的特點:

    1. 運算順序從右往左,如:int num = a + b +c; 先做a + b + c再做num = a + b + c;

    2. 賦值運算子的左邊,只能是變數,右邊可以是變數,常量,表示式。

    3. 複合賦值運算子會進行型別轉換

      byte b = 3;
      b += 2;//等價於b = (byte)b + 2;
      b = b + 2;//×
      b++; //等價於b = (byte)b + 1;
      

六、三元運算子

基本語法:條件表示式?表示式1:表示式2;

運算規則:

  1. 如果條件表示式為true,運算後的結果是表示式1;
  2. 如果條件表示式為false,運算後的結果是表示式2;

口訣:真1假2

  • 案例:

    int a = 10;
    int b = 99;
    int result = a < b ? a++ : b--;//因為a<b為true,所以左第一個表示式a++;result=10;a=11,第二個表示式不做。
    
  • 注意:

    1. 表示式1和表示式2的型別要為接收變數可以接收的型別.

      int a = 3;
      int b = 8;
      int c = a > b ? 1.1 : 3.4;//×,int型別無法接收double型別的值。
      
    2. 三元運算子可以轉成if-else語句

  • 練習題:

    求三個數的最大值

    int a = 65156;
    int b = 516165;
    int c = 1532;
    int max = a > b ? a : b;
    int max2 = max > c ? max : c;
    //或者合併成一句話:int max = c > (a > b ? a : b) ? c : (a > b ? a : b);
    //但是合併成一句話明顯沒有分開寫清晰易懂。
    System.out.println(max);
    //後續問題:排序問題。
    

七、運算子的優先順序

  1. 運算子有不同的優先順序,也就是運算子的執行順序。
  2. 只有單目運算子、賦值運算子從右向左運算的。
  • 運算子的優先順序一覽(從上到下依次降低):

    執行順序 運算子
    . () {} ; ,
    R-->L ++ -- ~ !(data type)
    L-->R * / %
    L--->R + -
    L--->R << >> >>> (移位運算)
    L--->R < > <= >= instanceof
    L--->R == !=
    L--->R &
    L--->R ^
    L--->R |
    L--->R &&
    L--->R ||
    L--->R 三目運算子
    R-->L 賦值運算子
  • 總結:
    留下大致印象,使用多了就會熟悉,優先順序從高到低的大致類別依次為

    1. () , {}等……比如int a, b ;
    2. 單目運算子
    3. 算術運算子
    4. 移位運算子
    5. 關係運算符
    6. 邏輯運算子
    7. 三目運算子
    8. 賦值運算子

    實際開發都用括號標記優先順序。