聊一聊Java中的各種運算符


計算機之所以叫“計算機”,其最基本用途之一就是運算,對應剛剛接觸Java的小伙伴而言,熟悉並掌握Java中的各種運算符及其在表達式中的運算優先級是十分必要的。

算術運算

算術運算主要用來處理數學中的加、減、乘、除四則運算。是最簡單、最常用的運算符。

1. 除與取模:數據做除法操作時,/ 是求商, % 是取余數。兩個整數相除得到的結果是商的整數部分

2. 自增與自減:在原數據的基礎上執行加1或減1的操作。

  • 單獨使用:放在操作數據的前面和后面效果是一樣的,如s++和++s效果一樣。
  • 參與操作:符號在操作數的前面表示先自增或自減,再參與操作。符號在操作數的后面表示先參與操作,后自增或自減
//來源:公眾號【時光與字節】
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(假),切勿將==誤寫為賦值號=。

邏輯運算

用於對布爾型數據進行操作,其結果仍為布爾型。

短路運算:以&和&&為例, | 和 || 是一樣的道理。

&和&&都表示與操作,當運算兩邊都為true時,其結果才為true。於是,當左邊為false時,即可確定結果為false,右邊是否運算已對結果沒有影響了。

  • &:不論左邊為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的值為:不及格

優先級

一個表達式中出現多個運算符,就有類似“先乘除后加減“這樣的先后問題,通常情況下:

  1. 優先級高低大致順序為:自增自減>算術運算>比較運算>邏輯運算>賦值運算;
  2. 如果兩個運算優先級相同,則左邊的表達式要比右邊的表達式先處理;
  3. 使用小括號吧,小括號能提升算式的優先級,並且會讓整個表達式邏輯結構更加清晰。如:(1+3)+(3+2)*2;

具體可參看下表,具有高優先級的運算符在表的上面,較低優先級在表的下面。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM