- C程序設計簡明教程(第二版)
- 雷新賢 黃榮保
- 2946字
- 2020-06-18 18:07:05
2.2 運算符和表達式
C語言的運算符不僅具有不同的優先級,而且還有一個特點,就是它的結合性。在表達式中,各運算量參與運算的先后順序不僅要遵守運算符優先級別的規定,還要受運算符結合性的制約,以便確定是自左向右進行運算還是自右向左進行運算。這種結合性是其他高級語言的運算符所沒有的,因此也增加了C語言的復雜性。C語言的運算符如表2-3所示。
表2-3 運算符分類表

續表

表達式是由常量、變量、函數和運算符組合起來的式子。表達式的值與類型等于計算表達式所得結果的值和類型。表達式求值按運算符的優先級和結合性規定的順序進行。單個的常量、變量、函數可以看作是表達式的特例。指針運算符和一些特殊運算符將在后續章節中介紹。
2.2.1 算術運算符和算術表達式
(1)基本的算術運算符
①加法運算符“+”:加法運算符為雙目運算符,即應有兩個量參與加法運算,如a+b,4+8等,具有左結合性。
②減法運算符“-”:減法運算符為雙目運算符,但“-”也可作負值運算符,此時為單目運算,例如,-x,-5等具有左結合性。
③乘法運算符“*”:雙目運算具有左結合性。
④除法運算符“/”:雙目運算具有左結合性。參與運算量均為整型時,結果也為整型,舍去小數。例如,10/7結果為1,2/5結果為0,1/3+1/3+1/3的結果也是0。如果運算量中有一個是實型,則結果為雙精度實型。
⑤取模運算符“%”:雙目運算,具有左結合性。要求參與運算的量均為整型。運算的結果為兩數相除后的余數。例如,5%3的值為2。
(2)算術表達式和運算符的優先級和結合性
算術表達式:用算術運算符和括號將運算對象(也稱操作數)連接起來的、符合C語法規則的式子;單獨的常量、變量、函數也是表達式。
以下是算術表達式的例子:
a+b (a*2)/c (x+r)*8-(a+b)/7
++i sin(x)+sin(y) (++i)-(j++)+(k--)
書寫表達式時應注意與數學公式的區別。例如:
數學式的C語言表達式為(x+y)/(a+b),為與數學運算要求一致可用括號調整運算的先后順序。
數學式的C語言表達式為(-b+sqrt(b*b-4*a*c))/(2*a)。
運算符的優先級:C語言中,運算符的運算優先級共分為14級。1級最高,14級最低。在表達式中,優先級較高的先于優先級較低的進行運算。而在一個運算量兩側的運算符優先級相同時,則按運算符的結合性所規定的結合方向處理。
運算符的結合性:C語言中各運算符的結合性分為兩種,即左結合性(自左至右)和右結合性(自右至左)。例如:算術運算符的結合性是自左至右,即先左后右。例如:表達式x-y+z,y應先與-號結合,執行x-y運算,然后再執行+z的運算。這種自左至右的結合方向就稱為“左結合性”。而自右至左的結合方向稱為“右結合性”。最典型的右結合性運算符是賦值運算符。如x=y=z,由于=的右結合性,應先執行y=z再執行x=(y=z)運算。C語言運算符中有不少為右結合性,應注意區別,以避免理解錯誤。
(3)自增、自減運算符
自增1,自減1運算符:自增1運算符記為++,其功能是使變量的值自增1。自減1運算符記為--,其功能是使變量值自減1。
自增1,自減1運算符均為單目運算,都具有右結合性。可有以下幾種形式:
++i:i自增1后再參與其他運算;
--i:i自減1后再參與其他運算;
i++:i參與運算后,i的值再自增1;
i--:i參與運算后,i的值再自減1。
例如:
int j=5,k=5,m,n;
m=j++; //相當于m=j;j=j+1;運算后j的值為6,m的值為5
n=++k; //相當于k=k+1;n=k;運算后k的值為6,n的值為6
【例2.5】閱讀程序,分析結果加深對各種算術運算的理解。

運行結果如圖2-6所示:

圖2-6 例2.5運行結果
說明:
i的初值為8,第5行i加1后輸出故為9;第6行減1后輸出故為8;第7行輸出i為8之后再加1(為9);第8行輸出i為9之后再減1(為8);第9行輸出-8之后再加1(i為9),第10行輸出-9之后再減1(i為8)。輸出的值與i值的變化如表2-4所示。
表2-4 輸出的值與i值的變化

2.2.2 關系運算符和關系表達式
關系運算是邏輯運算中比較簡單的一種。所謂“關系運算”實際上就是“比較運算”,將兩個值進行比較,判斷比較的結果是否符合給定的條件。在程序中經常需要比較兩個量的大小關系,以決定程序下一步的工作。
(1)關系運算符及其優先級
C語言中的關系運算符如表2-5所示。
表2-5 C語言中的關系運算符

關系運算符都是雙目運算符,其結合性均為左結合。關系運算符的優先級低于算術運算符,高于賦值運算符。在六個關系運算符中,<,<=,>,>=的優先級相同,高于==和!=;==和!=的優先級相同。
(2)關系表達式
關系表達式是指用關系運算符將兩個表達式連接起來的有意義的式子。
關系表達式的一般形式為:
表達式 關系運算符 表達式
例如:x>y,5>3,三角形兩邊之和大于第三邊(a+b)>c,都是合法的關系表達式。由于表達式也可以是關系表達式。因此也允許出現嵌套的情況,例如:(a!=b)<(c>d),b<c+d!=a等。
在進行關系運算時,需要注意以下幾點:
關系表達式的結果是一個邏輯值,在C語言中邏輯值“真”用“1”表示,“假”用“0”表示。若關系表達式成立,則結果為1,否則,結果為0。例如:5>3成立,邏輯值為真,結果為1。
關系運算符的優先級低于算術運算符,高于賦值運算符=。
在C語言中,符號=用作賦值運算符,因而用==表示等于關系。另外,表示大于等于、小于等于、不等于所用的表示方法也和數學公式中的不同。
【例2.6】閱讀程序,分析結果加深對各種關系運算的理解。

運行結果如圖2-7所示。

圖2-7 例2.6運行結果
2.2.3 邏輯運算符和邏輯表達式
(1)邏輯運算符及其優先級
關系表達式只能描述單一條件,例如x>=0,如果需要描述x>=0同時x<10,就要借助邏輯表達式了。
C語言中提供了三種邏輯運算符,如表2-6所示。
表2-6 C語言中的三種邏輯運算符

邏輯與運算符“&&”和邏輯或運算符“||”均為雙目運算符,具有左結合性。邏輯非運算符“!”為單目運算符,具有右結合性。邏輯運算符和其他運算符優先級的關系如圖2-8所示。

圖2-8 運算符優先級
按照運算符的優先順序可以得出:
a>b&&c>d 等價于 (a>b)&&(c>d)
!b==c||d<a 等價于 ((!b)==c)||(d<a)
a+b>c&&x+y<b 等價于 ((a+b)>c)&&((x+y)<b)
(2)邏輯運算的值
邏輯運算的值分為“真”和“假”兩種,用“1”和“0”來表示。表2-7為邏輯運算的“真值表”。用它表示當a和b的值為不同組合時,各種邏輯運算所得到的值。
表2-7 邏輯運算真值表

其求值規則如下:
①邏輯與運算“&&”:參與運算的兩個量都為真時,結果才為真,否則為假。
②邏輯或運算“||”:參與運算的兩個量只要有一個為真,結果就為真;兩個量都為假時,結果為假。
③邏輯非運算“!”:參與運算量為真時,結果為假;參與運算量為假時,結果為真。
【例2.7】閱讀程序,分析結果加深對各種邏輯運算的理解。

運行結果如圖2-9所示。

圖2-9 例2.7運行結果
雖然C語言編譯在給出邏輯運算值時,以“1”代表“真”,“0”代表“假”。但反過來在判斷一個量是為“真”還是為“假”時,以“0”代表“假”,以非“0”的數值作為“真”。
(3)邏輯表達式
邏輯表達式的一般形式為:
表達式 邏輯運算符 表達式
其中,表達式可以又是邏輯表達式,從而組成了嵌套的情形。
例如:(a&&b)&&c,根據邏輯運算符的左結合性,上式也可寫為:a&&b&&c。
邏輯表達式的值是式中各種邏輯運算的最終值,以“1”和“0”分別代表“真”和“假”。
2.2.4 條件運算符和條件表達式
如果在條件語句中,只執行單個的賦值語句時,常可使用條件表達式來實現。條件運算符為“?:”,它是一個三目運算符,即有三個參與運算的量。
由條件運算符組成條件表達式的一般形式為:
表達式1 ?表達式2 :表達式3
其執行的過程是:當表達式1的值為真,則以表達式2的值作為條件表達式的值,否則以表達式3的值作為條件表達式的值。例如:當x=6,y=7時,條件表達式x>y?x:y的結果為7,即取變量y的值。
使用條件表達式時,還應注意以下幾點:
①條件運算符的運算優先級低于關系運算符和算術運算符,但高于賦值符;
②條件運算符“?”和“:”是一對運算符,不能分開單獨使用;
③條件運算符的結合方向是自右至左。
例如:a>b?a:c>d?c:d應理解為a>b?a:(c>d?c:d)。這也就是條件表達式嵌套的情形,即其中的表達式3又是一個條件表達式。
【例2.8】從鍵盤輸入任意兩個整數,輸出大的一個。

運行結果如圖2-10所示。

圖2-10 例2.8運行結果
2.2.5 賦值運算符和賦值表達式
(1)一般賦值運算符
簡單賦值運算符和表達式:簡單賦值運算符記為“=”。由“=”連接的式子稱為賦值表達式。其一般形式為:
變量=表達式;
例如,x=a+b,賦值表達式的功能是計算表達式的值再賦予左邊的變量。賦值運算符具有右結合性。
在C語言程序中,凡是表達式可以出現的地方均可出現賦值表達式。例如,式子x=(a=5)+(b=8)是合法的。它的意義是把5賦予a,8賦予b,再把a,b相加,和賦予x,故x應等于13。
(2)復合賦值運算符
在賦值符“=”之前加上其他二目運算符可構成復合賦值符。例如,+=,-=,*=,/=,%=,<<=,>>=,&=,∧=,|=
構成復合賦值表達式的一般形式為:
變量 雙目運算符=表達式
它等效于:
變量=變量 運算符 表達式
例如:
a+=5 等價于a=a+5
x*=y+7 等價于x=x*(y+7)
r%=p 等價于r=r%p
復合賦值運算符這種寫法對于初學者可能不習慣,但十分有利于編譯處理,能提高編譯效率并產生質量較高的目標代碼。
2.2.6 逗號運算符和逗號表達式
在C語言中逗號“,”也是一種運算符,稱為逗號運算符。其功能是把兩個表達式連接起來組成一個表達式,稱為逗號表達式。
其一般形式為:
表達式1,表達式2,…,表達式n
其求值過程是從左至右分別求各個表達式的值,并以表達式n的值作為整個逗號表達式的值。
【例2.9】閱讀并運行程序,分析結果加深對各種算術運算的理解。

語句a=(b=2,++b,b+5);先執行b=2;再執行++b,此時b的值為3;最后執行b+5,b的值為8;將8賦值給變量a,運行結果如圖2-11所示。

圖2-11 例2.9運行結果
- 軟件安全技術
- 程序員修煉之道:程序設計入門30講
- Reporting with Visual Studio and Crystal Reports
- Magento 2 Theme Design(Second Edition)
- Reactive Programming with Swift
- 微服務設計原理與架構
- Django Design Patterns and Best Practices
- Swift 3 New Features
- Visual Basic程序設計教程
- GameMaker Programming By Example
- HDInsight Essentials(Second Edition)
- C++新經典
- PLC應用技術(三菱FX2N系列)
- Visual Basic 程序設計實踐教程
- After Effects CC技術大全