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

3.7 運算符與表達式

在程序設計中經常要進行各種運算,從而達到改變變量值的目的。要實現運算,就要使用運算符。運算符是用來表示某一種運算的符號,它指明了對操作數所進行的運算。按操作數的數目來分,有一元運算符(如++)、二元運算符(如+、>)和三元運算符(如?:),它們分別對應于一個、兩個和三個操作數。按照運算符功能來分,基本的運算符有下面幾類。

●算術運算符:+、—、?、/、%、++、——。

●關系運算符:>、<、>=、<=、==、!=。

●邏輯運算符:!、&&、||、&、|。

●位運算符:>>、<<、>>>、&、|、^、~。

●賦值運算符:=;擴展賦值運算符,如+=、/=等。

●條件運算符:?:。

●其他運算符:包括分量運算符.、下標運算符[]、實例運算符instanceof、內存分配運算符new、強制類型轉換運算符(類型)、方法調用運算符()等。

3.7.1 算術運算符

顧名思義,算術運算符就是用來進行算術運算的符號。這類運算符是最基本、最常見的。算術運算符作用于整型或浮點型數據,完成相應的算術運算。Java語言的算術運算符分為一元運算符和二元運算符。一元運算符只有一個操作數參加運算,而二元運算符則有兩個操作數參加運算。

1.二元算術運算符

二元算術運算符如表3.8所示。

表3.8 二元算術運算符

對于除號“/”,它的整數除法和實數除法是有區別的:兩個整數之間做除法時,只保留整數部分而舍棄小數部分。對于兩個整數之間的除法和取模運算,式子(a/b)?b+(a%b)==a恒成立。

對取模運算符“%”來說,其操作數可以為浮點數。即a%b與a-((int)(a/b)?b)的語義相同,這表示a%b的結果是除完后剩下的浮點數部分。只有單精度操作數的浮點表達式按照單精度運算求值,產生單精度結果。如果浮點表達式中含有一個或一個以上的雙精度操作數,則按雙精度運算,結果是雙精度浮點數,如37.2%10=7.2。

值得注意的是Java語言對加運算符進行了擴展,使它能夠進行字符串的連接,如"abc"+"de",得到字符串"abcde",詳見3.7.7節。

2.一元算術運算符

一元算術運算符如表3.9所示。

表3.9 一元算術運算符

加1、減1運算符既可放在操作數之前(如++i或——i),也可放在操作數之后(如i++或i——),但兩者的運算方式不同。如果放在操作數之前,操作數先進行加1或減1運算,然后將結果用于表達式的操作;如果放在操作數之后,則操作數先參加其他的運算,然后再進行加1或減1運算。例如:

說明一元運算符與操作數之間不允許有空格。加1或減l運算符不能用于表達式,只能用于簡單變量。例如,++(x+1)有語法錯誤。

3.7.2 關系運算符

關系運算符用于比較兩個值之間的大小,結果返回邏輯型的值true或false。關系運算符都是二元運算符,如表3.10所示。

表3.10 關系運算符

注意不能在浮點數之間做“==”的比較,因為浮點數在表達上有難以避免的微小誤差,精確的相等比較無法達到,所以這類比較沒有意義。

3.7.3 邏輯運算符

邏輯運算與關系運算的關系非常密切,關系運算是運算結果為邏輯型量的運算,而邏輯運算是操作數與運算結果都是邏輯型量的運算。邏輯運算符如表3.11所示。

表3.11 邏輯運算符

!為一元運算符,實現邏輯非。&、|為二元運算符,實現邏輯與、邏輯或運算。簡潔運算(&&、||)與非簡潔運算(&、|)的區別在于:非簡潔運算在必須計算完左右兩個表達式之后,才取結果值;而簡潔運算可能只需計算左邊的表達式而不用計算右邊的表達式,即對于&&,只要左邊表達式為false,就不用計算右邊表達式,則整個表達式為false;對于||,只要左邊表達式為true,就不用計算右邊表達式,則整個表達式為true。

對于異或運算可以通過一句話來記住它:兩個值不同,值為真;兩個值相同,值為假(不同,稱為“異”,也就是說兩個值不能相同)。

下面的例子說明了關系運算符和邏輯運算符的使用。

例3.8】 關系運算符和邏輯運算符的使用。

其運行結果為:

     a<b=false
     x^y=true
     a%e=1
     f=0

該程序第12行的條件中左邊式子b<0雖然為false,但非簡潔運算符“&”還必須要求再計算右邊的式子e!=0是否成立,盡管該式成立,但整個式子“b<0&e!=0”的結果值仍為false,因此該行后面的輸出語句中的“b/0”永遠都不會被計算;但第15行if語句中的“&&”為簡潔運算符,所以只要左邊的式子“f!=0”不成立,就不需計算右邊的“a/f>5”式子,所以在運行時不會發生除0溢出的錯誤。

3.7.4 位運算符

位運算符是對操作數以二進制比特位為單位進行的操作和運算,Java語言中提供了如表3.12所示的位運算符。

表3.12 位運算符

Java語言的位運算符可分為按位運算和移位運算兩類。這兩類位運算符中,除一元運算符“~”以外,其余均為二元運算符。位運算符的操作數只能為整型或字符型數據。有的符號(如&,|,^)與邏輯運算符的寫法相同,但邏輯運算符的操作數為boolean型的量。用戶在使用這種運算符要注意它們的區別。

3.7.5 賦值運算符

1.賦值運算符

關于賦值運算符“=”,我們在3.4節介紹變量的賦值時已經簡單提過。簡單的賦值運算是把一個表達式的值直接賦給一個變量或對象,使用的賦值運算符是“=”,其格式如下:

     變量或對象=表達式;

在賦值運算符兩側的類型不一致的情況下,則需要按3.5節中介紹的規則進行自動或強制類型轉換。即變量從占用內存較少的短數據類型轉化成占用內存較多的長數據類型時,Java會自動進行隱含類型轉換;而將變量從較長的數據類型轉換成較短的數據類型時,則必須做強制類型轉換,即采用“(類型)表達式”的方式。

賦值運算符右端的表達式可以還是賦值表達式,形成連續賦值的情況。例如:

     a=b=c=8;

首先執行c=8,該賦值表達式的值是8,然后再執行b=8,該表達式的值是8,最后執行a=8。

2.擴展賦值運算符

在賦值符“=”前加上其他運算符,即構成擴展賦值運算符,例如,a+=3等價于a=a+3。即擴展賦值運算符是先進行某種運算之后,再對運算的結果進行賦值。表3.13列出了Java語言中的擴展賦值運算符及等效表達式。

表3.13 擴展賦值運算符及等效表達式

3.7.6 條件運算符

Java語言提供了高效簡便的三元條件運算符(?:)。該運算符的格式如下:

     表達式1?表達式2:表達式3;

其中,“表達式1”是一個結果為布爾值的邏輯表達式。該運算符的功能是:計算“表達式1”的值,當“表達式1”的值為true時,則將“表達式2”的值作為整個表達式的值;當“表達式1”的值為false時,則將“表達式3”的值作為整個表達式的值。例如,

當要通過測試某個表達式的值來選擇兩個表達式中的一個進行計算時,用條件運算符來實現是一種簡練的方法。這時,它實現了if-else語句的功能。

3.7.7 字符串運算符

字符串運算符“+”是以String為對象進行的操作。運算符“+”完成字符串連接操作,如果必要,系統則自動把操作數轉換為String型。例如:

如果操作數是一個對象,則可利用相應類中的toString()方法,將該對象轉換成字符串,然后再進行字符串連接運算。“+=”運算符也可以用于字符串。如設s1為String型,a為int型,則有

3.7.8 表達式及運算符的優先級、結合性

表達式是由變量、常量、對象、方法調用和操作符組成的式子,它執行這些元素指定的計算并返回某個值。如,a+b,c+d等都是表達式,表達式用于計算并對變量賦值,或作為程序控制的條件。作為特例,單獨的常量、變量或方法等均可看作是一個表達式。

在對一個表達式進行運算時,要按運算符的優先順序從高向低進行。運算符的優先級決定了表達式中不同運算執行的先后順序,大體上來說,從高到低是:一元運算符、算術運算、關系運算和邏輯運算、賦值運算。運算符除有優先級外,還有結合性,運算符的結合性決定了并列的多個同級運算符的先后執行順序。同級的運算符大都是按從左到右的方向進行(稱為“左結合性”)。大部分運算的結合性都是從左向右,而賦值運算、一元運算等則有右結合性。表3.14給出了Java語言中運算符的優先級和結合性。

表3.14 運算符的優先級及結合性(表頂部的優先級較高)

在表達式中,可以用括號()顯式地標明運算次序,括號中的表達式首先被計算。適當地使用括號可以使表達式的結構清晰。例如:

     a>=b&&c<d||e==f

可以用括號顯式地寫成:

     ((a<=b)&&(c<d))||(e==f)

這樣就清楚地表明了運算次序,使程序的可讀性加強。

注意括號的使用必須匹配。

主站蜘蛛池模板: 尉犁县| 阆中市| 瑞金市| 怀化市| 赤壁市| 九江县| 鞍山市| 土默特右旗| 重庆市| 靖边县| 景宁| 东城区| 洛隆县| 开封县| 琼结县| 东明县| 大港区| 象州县| 绥化市| 湖北省| 灵武市| 贵港市| 修水县| 海原县| 汝州市| 宣恩县| 东乡| 靖西县| 横山县| 禄劝| 云和县| 梧州市| 雅江县| 达孜县| 安龙县| 长武县| 宁河县| 乌什县| 玉溪市| 布尔津县| 获嘉县|