java運算符

java基礎(chǔ)編程

java基本語法—運算符

運算符是一種特殊的符號,表示數(shù)據(jù)的運算、賦值和比較等。

  • 算術(shù)運算符
  • 賦值運算符
  • 比較運算符(關(guān)系運算符)
  • 邏輯運算符
  • 位運算符(用的少)
  • 三元運算符

2.4.1 運算符:算術(shù)運算符

算術(shù)運算符
/*
運算符之一:算術(shù)運算符
+ — + — * / % (前)++ (后)++ (前)-- (后)-- +

*/
class AriTest{
    public static void main(String[] agra){
        //除號:/
        int num1 = 12;
        int num2 = 5;
        int result1 = num1 / num2;
        System.out.println(result1);//2

        int result2 = num1 / num2 * num2;
        System.out.println(result2);//10

        double result3 = num1 / num2;//先算的仍然是int型,算完賦值給double
        System.out.println(result3);//2.0

        double result4 = num1 / num2 + 0.0;//2.0
        double result5 = num1 / (num2 + 0.0);//2.4
        double result6 = (double)num1 / num2;//2.4
        System.out.println(result5);
        System.out.println(result6);

        //%:取余運算
        //結(jié)果符號與被模數(shù)的符號相同
        //開發(fā)中,經(jīng)常使用%來判斷能否被除盡的情況
        int m1 = 12;
        int n1 = 5;
        System.out.println("m1 % n1 = " + m1 % n1);

        int m2 = -12;
        int n2 = 5;
        System.out.println("m2 % n2 = " + m2 % n2);

        int m3 = 12;
        int n3 = -5;
        System.out.println("m3 % n3 = " + m3 % n3);

        int m4 = -12;
        int n4 = -5;
        System.out.println("m4 % n4 = " + m4 % n4);

        //(前)++:先自增1,然后再運算
        //(后)++:先運算,后自增1
        int a1 = 10;
        int b1 = ++a1;
        System.out.println("a1 = "+ a1 + ",b1 = "+ b1);

        int a2 = 10;
        int b2 = a2++;
        System.out.println("a2 = "+ a2 + ",b2 = "+ b2);

        int a3 = 10;
        ++a3;//a3++;
        int b3 = a3;
        
        //注意點:
        short s1 = 10;
        //s1 = s1 + 1;//編譯失?。簭膇nt型轉(zhuǎn)short型會有損失
        //s1 = (short)(s1 + 1);//正確的
        //1為常量是int型,結(jié)果不好給short型
        //short占2個字節(jié),1占4個字節(jié),它們先相加,之后short()再截掉多余的兩個字節(jié)
        s1++;//自增1不會改變本身變量的數(shù)據(jù)類型
        System.out.println(s1);

        //問題:
        byte bb1 =127;
        bb1++;//編譯可以通過
        System.out.println("bb1 = " + bb1);//-128

        //(前)-- :先自減1,后運算
        //(后)-- :先運算,后自減1
        
        int a4 = 10;
        int b4 = a4--;//int b4 = --a4;
        System.out.println("a4 = " + a4 + ",b4 = " + b4);

    }
}

練習(xí)1

練習(xí)
  • i = 10 i1 = 11
  • i = 12 i1 = 12
  • i = 20 i2 = 19
  • i = 18 i2 = 18

練習(xí)2

隨意給出一個三位數(shù)的整數(shù),打印顯示它的個位數(shù),十位數(shù),百位數(shù)的值。

/*
練習(xí):隨意給出一個三位數(shù)的整數(shù),打印顯示它的個位數(shù),十位數(shù),百位數(shù)的值。
格式如下:
數(shù)字xxx的情況如下:
個位數(shù):
十位數(shù):
百位數(shù):

例如:
數(shù)字153的情況如下:
個位數(shù):3
十位數(shù):5
百位數(shù):1

*/
class AriExer {
    public static void main(String[] args) {
        
        int num = 187;
        
        int bai = num / 100;
        //先取模100,再除以10
        int shi = num % 100 / 10;//int shi = num / 10 % 10;
        int ge = num % 10;
        //取模1結(jié)果是0
        
        System.out.println("百位為:" + bai);
        System.out.println("十位為:" + shi);
        System.out.println("個位為:" + ge);

    }
}

2.4.2運算符:賦值運算符

  • 符號: =
    • 當(dāng)“=”兩側(cè)數(shù)據(jù)類型不一致時,可以使用自動類型轉(zhuǎn)換或使用強制類型轉(zhuǎn)換原則進行處理 。
    • 支持連續(xù)賦值
  • 擴展賦值運算符: +=,-=,*=,/=, %=
/*
運算符之二:賦值運算符
=  +=  -=  *=  /=  %= 


*/
class SetValueTest {
    public static void main(String[] args) {
        //賦值符號:=
        int i1 = 10;
        int j1 = 10;

        int i2,j2;
        //連續(xù)賦值
        i2 = j2 = 10;

        int i3 = 10,j3 = 20;
        
        //*********************
        int num1 = 10;
        num1 += 2;//num1 = num1 + 2;
        System.out.println(num1);//12

        int num2 = 12;
        num2 %= 5;//num2 = num2 % 5;
        System.out.println(num2);//2

        short s1 = 10;
        //s1 = s1 + 2;//編譯失敗,int不能轉(zhuǎn)換為short
        s1 += 2;//結(jié)論:不會改變變量本身的數(shù)據(jù)類型
        System.out.println(s1);//12

        //開發(fā)中,如果希望變量實現(xiàn)+2的操作,有幾種方法?(前提:int num = 10;)
        //方式一:num = num + 2;
        //方式二:num += 2; (推薦)
        
        //開發(fā)中,如果希望變量實現(xiàn)+1的操作,有幾種方法?(前提:int num = 10;)
        //方式一:num = num + 1;
        //方式二:num += 1; 
        //方式三:num++; (推薦)
        
        //練習(xí)1
        int i = 1;
        i *= 0.1;//0.1是double,編譯通過,但i還是int
        System.out.println(i);//0
        i++;
        System.out.println(i);//1

        //練習(xí)2
        int m = 2;
        int n = 3;
        n *= m++; //n = n * m++;    
        System.out.println("m=" + m);//3
        System.out.println("n=" + n);//6
        
        //練習(xí)3
        int n1 = 10;
        n1 += (n1++) + (++n1);//n1 = n1 + (n1++) + (++n1);從作往右10 + 10 +12
        System.out.println(n1);//32

    }
}

2.4.3運算符:比較運算符

比較運算符
/*
運算符之三:比較運算符
==  !=  >  <  >= <=  instanceof

結(jié)論:
1.比較運算符的結(jié)果是boolean類型
2.區(qū)分 ==  和  = 
*/
class CompareTest {
    public static void main(String[] args) {
        int i = 10;
        int j = 20;

        System.out.println(i == j);//false
        System.out.println(i = j);//20,現(xiàn)將j賦值給i,再輸出i

        boolean b1 = true;
        boolean b2 = false;
        System.out.println(b2 == b1);//false
        System.out.println(b2 = b1);//true
    }
}

2.4.4邏輯運算符

邏輯運算符
  • 邏輯運算符用于連接布爾型表達式,在 Java中不可以寫成 3<x<6,應(yīng)該寫 成x>3 & x<6 .
  • “&” 和“ &&” 的區(qū)別:
    • 單&時,左邊無論真假,右邊都進行運算;
    • 雙&時,如果左邊為真,右邊參與運算,如果左邊為假,右邊不參與運算。
  • "|"和"||"同理,||表示:當(dāng)左邊為真,右邊不參與運算。
  • 異或(^)與或(|)不同之處是,當(dāng)左右都為true,結(jié)果為false
  • 異或,追求的是"異"
/*
運算符之四:邏輯運算符

&  && |  || ! ^

說明:
1.邏輯運算符操作的都是boolean類型的變量


*/
class LogicTest {
    public static void main(String[] args) {
        
        //區(qū)分& 與 &&
        //相同點1:& 與  && 的運算結(jié)果相同
        //相同點2:當(dāng)符號左邊是true時,二者都會執(zhí)行符號右邊的運算
        //不同點:當(dāng)符號左邊是false時,&繼續(xù)執(zhí)行符號右邊的運算。&&不再執(zhí)行符號右邊的運算。
        //開發(fā)中,推薦使用&&
        boolean b1 = true;
        b1 = false;
        int num1 = 10;
        if(b1 & (num1++ > 0)){
            System.out.println("我現(xiàn)在在北京");
        }else{
            System.out.println("我現(xiàn)在在南京");
        }

        System.out.println("num1 = " + num1);
        

        boolean b2 = true;
         b2 = false;
        int num2 = 10;
        if(b2 && (num2++ > 0)){
            System.out.println("我現(xiàn)在在北京");
        }else{
            System.out.println("我現(xiàn)在在南京");
        }

        System.out.println("num2 = " + num2);

        // 區(qū)分:| 與 || 
        //相同點1:| 與  || 的運算結(jié)果相同
        //相同點2:當(dāng)符號左邊是false時,二者都會執(zhí)行符號右邊的運算
        //不同點3:當(dāng)符號左邊是true時,|繼續(xù)執(zhí)行符號右邊的運算,而||不再執(zhí)行符號右邊的運算
        //開發(fā)中,推薦使用||
        boolean b3 = false;
        b3 = true;
        int num3 = 10;
        if(b3 | (num3++ > 0)){
            System.out.println("我現(xiàn)在在北京");
        }else{
            System.out.println("我現(xiàn)在在南京");
        }
        System.out.println("num3 = " + num3);


        boolean b4 = false;
        b4 = true;
        int num4 = 10;
        if(b4 || (num4++ > 0)){
            System.out.println("我現(xiàn)在在北京");
        }else{
            System.out.println("我現(xiàn)在在南京");
        }
        System.out.println("num4 = " + num4);
    }
}

2.4.5運算符:位運算符

位運算符
  • 左右移是針對二進制進行整體移動
  • 每向左移動一位,相當(dāng)于在原來數(shù)據(jù)基礎(chǔ)上乘以2
左右移示例
/*
運算符之五:位運算符 (了解)

結(jié)論:
1. 位運算符操作的都是整型的數(shù)據(jù)
2. << :在一定范圍內(nèi),每向左移1位,相當(dāng)于 * 2
   >> :在一定范圍內(nèi),每向右移1位,相當(dāng)于 / 2,如果二進制最高位為0,左邊拿0補,最高位為1,左邊拿1補
   >>> : 無符號往右移,空位都用0補


面試題:最高效方式的計算2 * 8 ?  2 << 3  或 8 << 1
*/
class BitTest {
    public static void main(String[] args) {
        int i = 21;
        i = -21;
        //i左移2位,21 * 4 = 84
        //整個最多32位,移到27位時,最高位為1,為負(fù),物極必反
        System.out.println("i << 2 :" + (i << 2));
        System.out.println("i << 3 :" + (i << 3));
        System.out.println("i << 27 :" + (i << 27));

        //&與
        //00001100  12
        //00000101  5
        //00000100  4   只要有0,結(jié)果是0,都是1,結(jié)果才是1
        
        //|或
        //00001100  12
        //00000101  5
        //00001101  13  只要有1,結(jié)果就是1

        //^異或
        //00001100  12
        //00000101  5
        //00001001  9   兩個不一樣,結(jié)果才是1

        //~取反~6 = -7(按位取反后是補碼,需要進一步轉(zhuǎn)回原碼,減1再取反)
        //0000 0000 0000 0000 0000 0000 0000 0110   6
        //1111 1111 1111 1111 1111 1111 1111 1001   -7(的補碼)
        //如果把6最高位改為1,則是-6的原碼,再改成-6的反碼,就是除了符號位之外,互相取反
        int m = 12;
        int n = 5;
        System.out.println("m & n :" + (m & n));//4
        System.out.println("m | n :" + (m | n));//13
        System.out.println("m ^ n :" + (m ^ n));//9

        //練習(xí):交換兩個變量的值
        int num1 = 10;
        int num2 = 20;
        System.out.println("num1 = " + num1 + ",num2 = " + num2);

        //方式一:定義臨時變量的方式
        //推薦的方式
        int temp = num1;
        num1 = num2;
        num2 = temp;

        //方式二:好處:不用定義臨時變量  
        //弊端:① 相加操作可能超出存儲范圍 ② 有局限性:只能適用于數(shù)值類型
        //num1 = num1 + num2;
        //num2 = num1 - num2;
        //num1 = num1 - num2;

        //方式三:使用位運算符
        //有局限性:只能適用于數(shù)值類型
        //num1 = num1 ^ num2;
        //num2 = num1 ^ num2;
        //num1 = num1 ^ num2;

        System.out.println("num1 = " + num1 + ",num2 = " + num2);

    }
}
異或再異或

2.4.6:三元運算符

格式
/*
運算符之六:三元運算符
1.結(jié)構(gòu):(條件表達式)? 表達式1 : 表達式2
2. 說明
① 條件表達式的結(jié)果為boolean類型
② 根據(jù)條件表達式真或假,決定執(zhí)行表達式1,還是表達式2.
  如果表達式為true,則執(zhí)行表達式1。
  如果表達式為false,則執(zhí)行表達式2。
③ 表達式1 和表達式 2要求是一致的。
④ 三元運算符可以嵌套使用

3. 
凡是可以使用三元運算符的地方,都可以改寫為if-else
反之,不成立。

4. 如果程序既可以使用三元運算符,又可以使用if-else結(jié)構(gòu),那么優(yōu)先選擇三元運算符。原因:簡潔、執(zhí)行效率高。
*/
class SanYuanTest {
    public static void main(String[] args) {
        
        //獲取兩個整數(shù)的較大值
        int m = 12;
        int n = 5;
        //如果m>n,為true,返回m賦值
        int max = (m > n)? m : n;
        System.out.println(max);

        double num = (m > n)? 2 : 1.0;
        //表達式1和表達式2應(yīng)該能用一個統(tǒng)一的類型去接受

        //(m > n)? 2 : "n大";//編譯錯誤,類型不統(tǒng)一

        //**************************
        n = 12;//此處可以統(tǒng)一用字符串接受,可以套娃
        String maxStr = (m > n)? "m大" : ((m == n)? "m和n相等" : "n大");
        System.out.println(maxStr);

        //*****************************
        //獲取三個數(shù)的最大值
        int n1 = 12;
        int n2 = 30;
        int n3 = -43;
        
        int max1 = (n1 > n2)? n1 : n2;
        int max2 = (max1 > n3)? max1 : n3;
        System.out.println("三個數(shù)中的最大值為:" + max2);

        //不建議
        //int max3 = (((n1 > n2)? n1 : n2) > n3)? ((n1 > n2)? n1 : n2) : n3;
        System.out.println("三個數(shù)中的最大值為:" + max3);

        //該寫成if-else:
        if(m > n){
            System.out.println(m);
        }else{
            System.out.println(n);
        }
    }
}

2.3.6運算符的優(yōu)先級

  • 運算符有不同的優(yōu)先級,所謂優(yōu)先級就是表達式運算中的算順序。如下表,上一行運符總優(yōu)先于下一行。
  • 只有單目運算符、三元運算符、賦值運算符是從右向左運算的。
運算符優(yōu)先級
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容