官术网_书友最值得收藏!

3.3 運算符

運算符是程序設計語言中重要的構成元素之一,運算符可以細分為算術運算符、位運算符、關系運算符、邏輯運算符和其他運算符。在本節的內容中,我們將詳細講解Java語言中運算符的基本知識。

知識點講解:

3.3.1 算術運算符

在數學中有加減乘除運算,算術運算符(Arithmetic Operator)就是用來處理數學運算的符號,這是最簡單、也最常用的符號。在數字處理中幾乎都會用到算術運算符,算術運算符可以分為基本運算符、取余運算符和遞增或遞減運算符等。具體說明如表3-2所示。

表3-2 算術運算符

1.基本運算符

在Java程序中,使用最廣泛的便是基本運算符。

實例3-8

使用基本運算符的加減乘除4種運算

源碼路徑:daima\3\JiBen1.java

實例文件JiBen1.java的主要實現代碼如下所示。

        public static void main(String args[]) {
        ①           int a=12;
        ②           int b=4;
                    //下面開始使用4種運算符
        ③           System.out.println(a-b);
        ④           System.out.println(a+b);
        ⑤           System.out.println(a*b);
        ⑥           System.out.println(a/b);
          }

拓展范例及視頻二維碼

范例3-8-01:演示基本運算的過程

源碼路徑:演練范例\3-8-01\

范例3-8-02:實現加密處理

源碼路徑:演練范例\3-8-02\

行①②分別定義兩個int類型的變量a和b,設置a的初始值是12,設置b的初始值是4。

行③使用println()函數輸出變量a和變量b的差。

行④使用println()函數輸出變量a和變量b的和。

行⑤使用println()函數輸出變量a和變量b的乘積。

行⑥使用println()函數輸出變量a除以b的結果。

執行后的結果如圖3-8所示。

圖3-8 使用基本運算符

注意:分母為零的情況要引起重視。計算機中的運算和數學運算有些不同,一般來說分母不能為零,為零會發生程序錯誤,但有時程序中分母為零并不是錯誤,例如下面的代碼(daima\3\Jiben.java)。

        public class Jiben {
          public static void main(String args[]){
                int AAA=126;          //定義int類型變量AAA的值是126
                //整型數據的分母不能為零
                System.out.println(a/0);
          }
        }

編譯上述代碼后會得到圖3-9所示的結果。

圖3-9 運行結果

上面的結果提示用戶分母不能為零,如果將上述代碼中的“int AAA=126”改為“double AAA=126”,編譯后會得到圖3-10所示的結果。

圖3-10 更改后的運行結果

對于基本運算符,只要將分子定義為double型,分母為零就是正確的,得到的值是無窮大,這一點希望初學者能夠加以理解。

2.取余運算符

在現實應用中,除法運算的結果不一定總是整數,計算結果是使用第一個運算數除以第二個運算數,得到整數結果后剩下的值,就是余數。在Java程序中,取余運算符用于計算除法操作中的余數。由于取余運算符也需要進行除法運算,因此如果取余運算的兩個運算數都是整數類型,則求余運算的第二個運算數不能是0,否則將引發除以零異常。如果取余運算的兩個操作數中有1個或2個是浮點數,則允許第二個操作數是0或0.0,只是求余運算的結果是NaN(NaN是Java中的特殊數字,表示非數字類型)。0或0.0對零以外的任何數求余都將得到0或0.0。

注意:取余運算符是一種很奇怪的運算符,在數學運算中很少被提及,其實可以很簡單地理解它。取余運算符一般被用在除法中,它的取值不是商,而是余數。例如5/2,取余運算符取的是余數,所以結果是1,而不是商值結果2.5。

實例3-9

使用“%”運算符

源碼路徑:daima\3\Yushu.java

實例文件Yushu.java的主要實現代碼如下所示:

        public static void main(String[] args) {
          //求余數
        ①        int A=19%3;
        ②        int K=-19%-3;
        ③        int Q=19%-3;
        ④        int J=-19%3;
        ⑤        System.out.println("A=19%3的余數"+A);
        ⑥        System.out.println("K=-19%-3的余數"+K);
        ⑦        System.out.println("Q=19%-3的余數"+Q);
        ⑧        System.out.println("J=-19%3的余數"+J);
        }

拓展范例及視頻二維碼

范例3-9-01:演示取余運算的規律

源碼路徑:演練范例\3-9-01\

范例3-9-02:用三元運算符判斷奇偶數

源碼路徑:演練范例\3-9-02\

行①定義1個int類型的變量A,設置其初始值是19除以3的余數。

行②定義1個int類型的變量K,設置其初始值是-19除以-3的余數。

行③定義1個int類型的變量Q,設置其初始值是19除以-3的余數。

行④定義1個int類型的變量J,設置其初始值是-19除以3的余數。

行⑤⑥⑦⑧分別使用println()函數輸出4個變量A、K、Q和J的值。

執行后的結果如圖3-11所示。

圖3-11 取余運算

3.遞增和遞減運算符

遞增和遞減運算符分別是指“++”和“--”,每執行一次,變量將會增加1或減少1,它們可以放在變量的前面,也可以放在變量的后面。無論哪一種形式都能改變變量的結果,但它們有一些不同,這種變化讓初學編程的人感到疑惑。遞增、遞減對于剛學編程的人來說是難點,讀者一定要加強理解。理解的不是++與--的問題,而是在變量前用還是在變量后用的問題。

實例3-10

使用遞增和遞減運算符

源碼路徑:daima\3\Dione.java

實例文件Dione.java的主要實現代碼如下所示。

        public static void main(String args[]){
        ①       int a=199;
        ②       int b=1009;
                //數據的遞增與遞減
        ③       System.out.println(a++);
        ④       System.out.println(a);
        ⑤       System.out.println(++a);
        ⑥       System.out.println(b--);
        ⑦       System.out.println(b);
        ⑧       System.out.println(--b);
        }

拓展范例及視頻二維碼

范例3-10-01:演示遞增和遞減運算符的用法

源碼路徑:演練范例\3-10-01\

范例3-10-02:更精確地運用浮點數

源碼路徑:演練范例\3-10-02\

行①②分別定義兩個int類型的變量a和b,設置a的初始值是199,設置b的初始值是1009。

行③使用println()函數輸出a++的值,此處先輸出,然后才加1,所以結果是199。

行④使用println()函數輸出a的值,因為在行②的最后加1了,所以這里的結果是200。

行⑤使用println()函數輸出++a的值,此處先加1,再輸出。這里要緊接著行④中a的值200,所以本行的結果是201。

行⑥使用println()函數輸出b--的值,此處先輸出b的值,再將b減1,所以本行的結果是1009。

行⑦使用println()函數輸出b的值,因為在行⑥的最后減1了,所以這里的結果是1008。

行⑧使用println()函數輸出--b的值,此處先減1,然后執行程序。這里要緊接著行⑦中b的值1008,所以本行的結果是1007。

執行后的結果如圖3-12所示。

圖3-12 使用遞增和遞減運算符

3.3.2 關系運算符和邏輯運算符

在Java程序設計中,關系運算符(Relational Operator)和邏輯運算符(Logical Operator)顯得十分重要。關系運算符定義值與值之間的相互關系,邏輯(logical)運算符定義可以用真值和假值鏈接在一起的方法。

1.關系運算符

在數學運算中有大于、小于、等于、不等于關系,在程序中可以使用關系運算符來表示上述關系。表3-3中列出了Java中的關系運算符,通過這些關系運算符會產生一個結果,這個結果是一個布爾值,即true或false。在Java中,任何類型的數據,都可以用“= =”比較是不是相等,用“!=”比較是否不相等,只有數字才能比較大小,關系運算的結果可以直接賦予布爾變量。

表3-3 關系運算符

2.邏輯運算符

布爾邏輯運算符是最常見的邏輯運算符,用于對布爾型操作數進行布爾邏輯運算,Java中的布爾邏輯運算符如圖3-4所示。

表3-4 邏輯運算符

邏輯運算符與關系運算符運算后得到的結果一樣,都是布爾類型的值。在Java程序設計中,“&&”和“”布爾邏輯運算符不總是對運算符右邊的表達式求值,如果使用邏輯與“&”和邏輯或“|”,則表達式的結果可以由運算符左邊的操作數單獨決定。通過表3-5,讀者可以了解常用邏輯運算符“&&”、“”、“! ”運算后的結果。

表3-5 邏輯運算符

在接下來的內容中,將通過一個具體實例來說明關系運算符的基本用法。

實例3-11

使用關系運算符

源碼路徑:daima\3\guanxi.java

實例文件guanxi.java的主要實現代碼如下所示。

        public static void main(String args[]){
        ①    char a='k';          //為a賦值
        ②    char b='k';          //為b賦值
        ③    char c='A';          //為c賦值
        ④    int d=100;           //為d賦值
        ⑤    int e=101;           //為e賦值
        ⑥     System.out.println(a==b);
               //下面開始分別輸出對應的運算結果
        ⑦     System.out.println(b==c);
        ⑧     System.out.println(b! =c);
        ⑨     System.out.println(d<e);
          }

拓展范例及視頻二維碼

范例3-11-01:演示邏輯運算符的用法

源碼路徑:演練范例\3-11-01\

范例3-11-02:不用乘法運算符實現2×16

源碼路徑:演練范例\3-11-02\

行①②③分別定義3個cha類型的變量a、b和c,并分別設置它們的初始值。

行④⑤分別定義兩個int類型的變量d和e,并分別設置它們的初始值。

行⑥使用println()函數輸出a==b的結果。

行⑦使用println()函數輸出b==c的結果。

行⑧使用println()函數輸出b!=c的結果。

行⑨使用println()函數輸出d<e的結果。

執行后的結果如圖3-13所示。

圖3-13 使用關系運算符

3.3.3 位邏輯運算符

在Java程序設計中,使用位邏輯運算符來操作二進制數據。讀者必須注意,位邏輯運算符只能操作二進制數據。如果用在其他進制的數據中,需要先將其他進制的數據轉換成二進制數據。位邏輯運算符(Bitwise Operator)可以直接操作整數類型的位,這些整數類型包括long、int、short、char和byte。Java語言中位邏輯運算符的具體說明如表3-6所示。

表3-6 位邏輯運算符

因為位邏輯運算符能夠在整數范圍內對位操作,所以這樣的操作對一個值產生什么效果是很重要的。具體來說,了解Java如何存儲整數值并且如何表示負數是非常有用的。表3-7中演示了操作數A和操作數B按位邏輯運算的結果。

表3-7 位邏輯運算結果

移位運算符把數字的位向右或向左移動,產生一個新的數字。Java的右移運算符有兩個,分別是>>和>>>。

? >>運算符:把第一個操作數的二進制碼右移指定位數后,將左邊空出來的位以原來的符號位填充。即,如果第一個操作數原來是正數,則左邊補0;如果第一個操作數是負數,則左邊補1。

? >>>:把第一個操作數的二進制碼右移指定位數后,將左邊空出來的位以0填充。

在接下來的內容中,將通過一個具體實例來說明位邏輯運算符的基本用法。

實例3-12

使用位邏輯運算符

源碼路徑:daima\3\wei.java

實例文件wei.java的主要實現代碼如下所示。

        public class wei {
              public static void main(String[] args){
        ①     int a=129;
        ②     int b=128;
        ③     System.out.println("a和b 與的結果是:"+(a&b));
              }
        }

拓展范例及視頻二維碼

范例3-12-01:演示與運算符的用法

源碼路徑:演練范例\3-12-01\

范例3-12-02:演示非運算符的用法

源碼路徑:演練范例\3-12-02\

行①②分別定義兩個cha類型的變量ab,并分別設置它們的初始值。

行③使用println()函數輸出a&b的結果。a的值是129,轉換成二進制就是10000001;而b的值是128,轉換成二進制就是10000000。根據與運算符的運算規律,只有兩個位都是1,運算結果才是1,所以a&b的運算過程如下。

        a          10000001
        b          10000000
        a&b       10000000

由此可以知道10000000的結果就是10000000,轉換成十進制就是128。執行后的結果如圖3-14所示。

圖3-14 執行結果

3.3.4 條件運算符

條件運算符是一種特殊的運算符,也被稱為三目運算符。它與前面所講的運算符有很大不同,Java中提供了一個三目運算符,其實這跟后面講解的if語句有相似之處。條件運算符的目的是決定把哪個值賦給前面的變量。在Java語言中使用條件運算符的語法格式如下所示。

        變量=(布爾表達式)? 為true時賦予的值:為false時賦予的值;

實例3-13

使用條件運算符

源碼路徑:daima\3\tiao.java

實例文件tiao.java的主要實現代碼如下所示。

          public static void main(String args[]){
          ①     double chengji=70;
          ②     String Tiao=(chengji>=90)? "已經很優秀":
                            "不是很優秀, 還需要努力!";
                //輸出結果
          ③     System.out.println(Tiao);
          }

拓展范例及視頻二維碼

范例3-13-01:根據條件的不同實現賦值

源碼路徑:演練范例\3-13-01\

范例3-13-02:實現兩個變量的互換

源碼路徑:演練范例\3-13-02\

行①定義double類型的變量chengji,設置其初始值是70。

行②定義String類型的變量Tiao,并賦值顯示條件運算結果。如果設置變量chengji大于或等于90,則輸出“已經很優秀”的提示;反之,就輸出“不是很優秀,還需要努力!”的提示。

行③使用println()函數輸出Tiao的值。因為在代碼中設置了“chengji=70”,所以執行后的結果如圖3-15所示。

圖3-15 執行結果

3.3.5 賦值運算符

賦值運算符是等號“=”,Java中的賦值運算與其他計算機語言中的賦值運算一樣,起到賦值的作用。在Java中使用賦值運算符的格式如下所示。

          var = expression;

其中,變量var的類型必須與表達式expression的類型一致。

賦值運算符有一個有趣的屬性,它允許我們對一連串變量進行賦值。請看下面的代碼。

          int x, y, z; x = y = z = 100;

在上述代碼中,使用一條賦值語句將變量x、y、z都賦值為100。這是由于“=”運算符表示右邊表達式的值,因此z = 100的值是100,然后該值被賦給y,并依次被賦給x。使用“字符串賦值”是給一組變量賦予同一個值的簡單辦法。在賦值時類型必須匹配,否則將會出現編譯錯誤。

實例3-14

演示賦值類型不匹配的錯誤

源碼路徑:daima\3\fuzhi.java

實例文件fuzhi.java的主要實現代碼如下所示。

          public static void main(String args[]){
              //定義的字節數據
          ①     byte a=9;
          ②     byte b=7;
          ③     byte c=a+b;
          ④     System.out.println(c);
          }

拓展范例及視頻二維碼

范例3-14-01:擴展賦值運算符的功能

源碼路徑:演練范例\3-14-01\

范例3-14-02:演示運算符的應用

源碼路徑:演練范例\3-14-02\

行①分別定義byte類型的變量a和b,設置a的初始值是9,設置b的初始值是7。

行②定義byte類型的變量c,并賦值為a和b的和。Java語言規定:byte類型的變量在進行加減乘除和余數運算時會自動變為int類型。所以,本行的變量a和b會在計算時自動轉換成int類型,但是本行在左側已經明確聲明為了byte類型,所以會出錯。

行③使用println()函數輸出變量c的值。執行后會提示類型不匹配錯誤,執行結果如圖3-16所示。

圖3-16 類型不匹配錯誤

注意:在Java中可以對賦值運算符進行擴展,其中最為常用的有如下擴展操作。

? +=:對于x+=y,等效于x=x+y。

? -=:對于x-=y,等效于x=x-y。

? *=:對于x*=y,等效于x=x*y。

? /=:對于x/=y,等效于x=x/y。

? %=:對于x%=y,等效于x=x%y。

? &=:對于x&=y,等效于x=x&y。

? |=:對于x|=y,等效于x=x|y。

? ^=:對于x^=y,等效于x=x^y。

? <<=:對于x<<=y,等效于x=x<<y。

? >>=:對于x>>=y,等效于x=x>>y。

? >>>=:對于x>>>=y,等效于x=x>>>y。

另外,在后面的學習中我們會接觸到equals()方法,此方法和賦值運算符= =的功能類似。要想理解兩者之間的區別,我們需要從變量說起。Java中的變量分為兩類,一類是值類型,它存儲的是變量真正的值,比如基礎數據類型,值類型的變量存儲在內存的棧中;另一類是引用類型,它存儲的是對象的地址,與該地址對應的內存空間中存儲的才是我們需要的內容,比如字符串和對象等,引用類型的變量存儲在內存中的堆中。賦值運算符= =比較的是值類型的變量,如果比較兩個引用類型的變量,比較的就是它們的引用地址。equals()方法只能用來比較引用類型的變量,也就是比較引用的內容。

= =運算符比較的是左右兩邊的變量是否來自同一個內存地址。如果比較的是值類型(基礎數據類型,如int和char之類)的變量,由于值類型的變量存儲在棧里面,當兩個變量有同一個值時,其實它們只用到同一個內存空間,所以比較的結果是true。

eqluals()方法是Object類的基本方法之一,所以每個類都有自己的equals()方法,功能是比較兩個對象是否是同一個,通俗的理解就是比較這兩個對象的內容是否一樣。

3.3.6 運算符的優先級

數學中的運算都是從左向右運算的,在Java中除了單目運算符、賦值運算符和三目運算符外,大部分運算符也是從左向右結合的。單目運算符、賦值運算符和三目運算符是從右向左結合的,也就是說,它們是從右向左運算的。乘法和加法是兩個可結合的運算,也就是說,這兩個運算符左右兩邊的操作符可以互換位置而不會影響結果。

運算符有不同的優先級,所謂優先級,就是在表達式運算中的運算順序。表3-8中列出了包括分隔符在內的所有運算符的優先級,上一行中的運算符總是優先于下一行的。

表3-8 Java運算符的優先級

根據表3-9所示的運算符的優先級,假設int a=3,開始分析下面變量b的計算過程。

          int b= a+2*a

程序先執行2*a得到6,再計算a+6得到9。使用圓括號( )可以改變程序的執行過程,例如:

          int b=(a+2)*a

先執行a+2得到5,再用5*a得到15。

實例3-15

使用表達式與運算符

源碼路徑:daima\3\biaoone.java

實例文件biaoone.java的主要實現代碼如下所示。

          public static void main(String args[]){
          ①       int a=231;
          ②       int b=4;
          ③       int h=56;
          ④       int k=45;
          ⑤       int x=a+h/b;
          ⑥       int y=h+k;
          ⑦        System.out.println(x);
          ⑧        System.out.println(y);
          ⑨        System.out.println(x==y);
          }

拓展范例及視頻二維碼

范例3-15-01:演示運算符的優先級

源碼路徑:演練范例\3-15-01\

范例3-15-02:演示關系運算符的應用

源碼路徑:演練范例\3-15-02\

行①②③④分別定義4個int類型的變量a、b、h和k,設置a的初始值是231,設置b的初始值是4,設置h的初始值是56,設置k的初始值是45。

行⑤定義一個int類型的變量x,并賦值為a+h/b,根據優先級規則,先計算除法h/b,后計算加法。

行⑥定義一個int類型的變量y,并賦值為h+k。

行⑦⑧⑨使用println()函數分別輸出變量x、y和表達式x= =y的值。

執行后的結果如圖3-17所示。

圖3-17 執行結果

注意:書寫Java運算符有兩點注意事項。

(1)不要把一個表達式寫得過于復雜,如果一個表達式過于復雜,就把它分成幾步來完成。

(2)不要過多地依賴運算符的優先級來控制表達式的執行順序,這樣可讀性太差,盡量使用圓括號( )來控制表達式的執行順序。

主站蜘蛛池模板: 耿马| 鄂州市| 元氏县| 大丰市| 保山市| 新平| 珲春市| 南平市| 博罗县| 云安县| 漳平市| 大名县| 华阴市| 汉阴县| 龙山县| 滕州市| 定西市| 湘乡市| 五原县| 福海县| 松溪县| 霸州市| 会理县| 开封市| 平罗县| 开封市| 沂南县| 马公市| 康定县| 汤原县| 临高县| 永嘉县| 仪陇县| 嘉义县| 迁安市| 房山区| 冀州市| 双城市| 郓城县| 台前县| 盱眙县|