C語言中運算和表達式的數(shù)量很多,C語言正是因為豐富的運算符和表達式使其語言功能十分完善,。C語言的運算符不僅具有不同的優(yōu)先級,還有結(jié)核性,。在表達式中,,各運算表達量參與運算的先后要遵守運算符優(yōu)先級別的規(guī)定,也要受運算符結(jié)合姓的制約,,以便確定是自左向右還是自右向左進行運算,。這種結(jié)合性,增加了C語言的復(fù)雜性,。 一,、C語言運算符簡介 C語言的運算符可以分為以下幾類: 1.算術(shù)運算符:用于各類數(shù)值運算。包括加(+),、減(-),、乘(*)、除(/),、求余(%),、自增(++),自減(--),,一共種,; 2.關(guān)系運算符:用于比較運算。包括大于(>),、小于(<),、等于(==)、大于等于(>=),、小于等于(<=),、不等于(!=),一共6種,; 3.邏輯運算符:用于邏輯運算,。包括邏輯與(&&)、邏輯或(||),,非(!),,共3種。 4.位操作運算符:參與運算的量,,按二進制位進行運算,。包括位與(&)、位或(|),、位非(!),、位異或(^)、左移(<<)、右移(>>),,共6種,。 5.賦值運算符:用于賦值運算,分為簡單賦值(=),、復(fù)合算術(shù)賦值(+=,、-=,*=,、/=,、%=)、和復(fù)合位運算賦值(&=,、!=,、^=、>>=,、<<=),,三類共11種; 6.條件運算符:這是一個三目運算符,,用于條件求值(? :),; 7.逗號運算符:用于把諾干表達式組合成一個表達式(,); 8.指針運算符:用于取內(nèi)容(*)和區(qū)地址(&),,兩種運算,; 9.求字節(jié)數(shù)運算符:用于計算數(shù)據(jù)類型所占的字節(jié)數(shù)(sizeof); 10.特殊運算符:有括號( ),、下標(biāo)[ ],、成員(->,)等幾種。
二,、算術(shù)運算符和算術(shù)表達式 1.基本的算術(shù)運算符 加法運算符“+”:加法運算符為雙目運算符,,即應(yīng)有兩個量參與加法運算。如a+b,,1+2等,,具有右結(jié)合性。 減法運算符“-”:減法運算符為雙目運算符,。但“-”也可作負值運算符,,此時為單目運算,如-a,,-1等,,具有左結(jié)合性。 乘法運算符“*”:雙目運算,,具有左結(jié)合性,。 除法運算符“/”:雙目運算,,具有左結(jié)合性。參與運算量均為整型時,,結(jié)果也為整型,,舍去小數(shù)。如果運算量中有一個是實型,,則結(jié)果為雙精度實型,。 求余運算符(模運算符)“%”:雙目運算,具有左結(jié)合性,。要求參與運算的量均為整型。 求余運算的結(jié)果等于兩數(shù)相除后的余數(shù),。
2.算術(shù)表達式和運算符的優(yōu)先級和結(jié)合性 表達式是由常量,、變量、函數(shù)和運算符組合起來的式子,。一個表達式有一個值及其類型,, 它們等于計算表達式所得結(jié)果的值和類型。表達式求值按運算符的優(yōu)先級和結(jié)合性規(guī)定的順序進行,。 算術(shù)表達式:用算術(shù)運算符和括號將運算對象(也稱操作數(shù))連接起來的,、符合C語法規(guī)則的式子。 運算符的優(yōu)先級:C語言中,,運算符的運算優(yōu)先級共分為15級,。1級最高,15級最低,。在表達式中,,優(yōu)先級較高的先于優(yōu)先級較低的進行運算。而在一個運算量兩側(cè)的運算符優(yōu)先級相同時,,則按運算符的結(jié)合性所規(guī)定的結(jié)合方向處理,。 運算符的結(jié)合性:C語言中各運算符的結(jié)合性分為兩種,即左結(jié)合性(自左至右)和右結(jié)合性(自右至左),。例如算術(shù)運算符的結(jié)合性是自左至右,,即先左后右。如有表達式a-b+c則b應(yīng)先與“-”號結(jié)合,,執(zhí)行a-b運算,,然后再執(zhí)行+c的運算。這種自左至右的結(jié)合方向就稱為“左結(jié)合性”,。而自右至左的結(jié)合方向稱為“右結(jié)合性”,。最典型的右結(jié)合性運算符是賦值運算符。如a=b=c,由于“=”的右結(jié)合性,,應(yīng)先執(zhí)行b=c再執(zhí)行a=(b=c)運算,。C語言運算符中有不少為右結(jié)合性,,應(yīng)注意區(qū)別,以避免理解錯誤,。 3.強制類型轉(zhuǎn)換運算符 其一般形式為: (類型說明符) (表達式) 4.自增、自減運算符 自增1,,自減1運算符:自增1運算符記為“++”,,其功能是使變量的值自增1。自減1運算符記為“--”,,其功能是使變量值自減1,。 自增1,自減1運算符均為單目運算,,都具有右結(jié)合性,。可有以下幾種形式: ++i i自增1后再參與其它運算,; --i i自減1后再參與其它運算,; i++ i參與運算后,i的值再自增1,; i-- i參與運算后,,i的值再自減1。 在理解和使用上容易出錯的是i++和i--,。 特別是當(dāng)它們出在較復(fù)雜的表達式或語句中時,,常常難于弄清,因此應(yīng)仔細分析,。 舉例: main(){ int i=4; printf('%d\n',++i); printf('%d\n',--i); printf('%d\n',i++); printf('%d\n',i--); printf('%d\n',-i++); printf('%d\n',-i--); } 舉例: main(){ int i=1,j=2,a,b; a=(i++)+(i++)+(i++); b=(++j)+(++j)+(++j); printf('%d,%d,%d,%d',a,b,i,j); } 這個程序中,對a=(i++)+(i++)+(i++)應(yīng)理解為三個i相加,,分別是1+2+3,,故a值為6。然后i再自增1一次相當(dāng)于加3故1的最后值為4,。而對于b 的值則不然,,b=(++j)+(++j)+(++j)應(yīng)理解為j先自增1,再參與運算,,3+4+5的和為12,,j的最后值為5,,b的值為12。 5.賦值運算符和賦值表達式 5.1賦值運算符 簡單賦值運算符記為=,。由=組建的式子稱為賦值表達式,。
簡單賦值表達式格式:變量=表達式; 賦值表達式的作用就是將賦值號右邊表達式的值賦給賦值號左邊的對象,。賦值表達式的類型為賦值號左邊對象的類型,,其結(jié)果值為賦值號左邊對象被賦值后的值。 簡單賦值表達式使用說明 賦值運算符的功能具有單向性,,即只能將表達式的值傳送變量,,反之則不然。 賦值運算符左邊只能是單個變量名,,不能是其他運算量,。 賦值運算符右邊可以是常量、變量,、函數(shù)或表達式。 ④ 賦值運算符兼有計算與賦值雙重功能,,它首先計算出賦值運算符右邊表達式的值,,然后把此值再賦給左側(cè)的變量。 ⑤ 賦值運算符具有右結(jié)合性,。因此a=b=c=5可理解為a=(b=(c=5)),,即表達式值為5,a,b,c均為5,。這個表達式從右向左運算,,在c被更新為5后,表達式c=5的值為5,,接著b的值被更新為5,,最后a被賦值為5。 ⑥ 凡是表達式可以出現(xiàn)的地方均可出現(xiàn)賦值表達式,。例如,,式子x=(a=5)+(b=8)是合法的。其意義是把5賦給a,,8賦給b,,再把a與b相加,和賦給x,,故x應(yīng)等于13,。 ⑦ 賦值運算符的優(yōu)先級低于算術(shù)運算符。 ⑧ 按照C++語言規(guī)定,,任何表達式在其末尾加上分號就構(gòu)成語句,,所以在賦值表達式末尾加分號就構(gòu)成了賦值語句,,在程序中大量使用。 賦值運算中的自動類型轉(zhuǎn)換 如果賦值運算符兩邊的數(shù)據(jù)類型不相同,,系統(tǒng)將自動進行類型轉(zhuǎn)換,,即把賦值運算符右邊的類型轉(zhuǎn)換成左邊的類型。具體規(guī)定如下,。 (1) 實型賦給整型,,舍去小數(shù)部分。 (2) 整型賦給實型,,數(shù)值不變,,但將以浮點形式存放,即增加小數(shù)部分(小數(shù)部分的值為0),。 (3) 字符型賦給整型,,由于字符型為一個字節(jié),故將字符的ASCII碼值放到整型量的低八位中,,高位為0,。整型賦給字符型,只把低八位賦給字符量,。 (4) 在賦值運算中,,賦值運算符兩邊量的數(shù)據(jù)類型不同時,賦值運算符右邊量的類型將轉(zhuǎn)換為左邊量的類型,。如果右邊量的數(shù)據(jù)類型長度比左邊長,,將丟失一部分數(shù)據(jù),這樣會降低精度,,丟失的部分按四舍五入向前舍入,。 三、逗號運算符和逗號表達式 C語言提供一種特殊的運算符——逗號運算符,。用它將兩個表達式連接起來,。如: 3+5,6+8 稱為逗號表達式,,又稱為“順序求值運算符”,。逗號表達式的一般形式為 表達式1,表達式2 逗號表達式的求解過程是:先求解表達式1,,再求解表達式2,。整個逗號表達式的值是表達式2的值。例如,,上面的逗號表達式“3+5,,6+8”的值為14。又如,,逗號表達式 a=3*5,,a*4 對此表達式的求解,,讀者可能會有兩種不同的理解:一種認為“3*5,a*4” 是一個逗號表達式,,先求出此逗號表達式的值,, 如果a的原值為3,則逗號表達式的值為12,,將12賦給a,, 因此最后a的值為12。另一種認為:“a=3*5”是一個賦值表達式,,“a*4”是另一個表達式,,二者用逗號相連,構(gòu)成一個逗號表達式,。這兩者哪一個對呢,?賦值運算符的優(yōu)先級別高于逗號運算符, 因此應(yīng)先求解a=3*5(也就是把“a=3*5”作為一個表達式),。經(jīng)計算和賦值后得到a的值為15,,然后求解a*4,得60,。整個逗號表達式的值為60,。 一個逗號表達式又可以與另一個表達式組成一個新的逗號表達式,如(a=3*5,,a*4),a+5 先計算出a的值等于15,,再進行a*4的運算得60(但a值未變,,仍為15),再進行a+5得20,,即整個表達式的值為20,。 逗號表達式的一般形式可以擴展為 表達式1,表達式2,,表達式3……表達式n 它的值為表達式n的值,。 逗號運算符是所有運算符中級別最低的。因此,,下面兩個表達式的作用是不同的: ① x=(a=3,,6*3) ② x=a=3,6*a 第①個是一個賦值表達式,,將一個逗號表達式的值賦給x,,x的值等于18。 第②個是逗號表達式,,它包括一個賦值表達式和一個算術(shù)表達式,,x的值為3,。 其實,逗號表達式無非是把若干個表達式“串聯(lián)”起來,。在許多情況下,,使用逗號表達式的目的只是想分別得到各個表達式的值,而并非一定需要得到和使用整個逗號表達式的值,,逗號表達式最常用于循環(huán)語句(for語句)中,。 請注意并不是任何地方出現(xiàn)的逗號都是作為逗號運算符。例如函數(shù)參數(shù)也是用逗號來間隔的,。如: printf('%d,,%d,%d',,a,,b,c),; 上一行中的“a,,b,c”并不是一個逗號表達式,,它是printf函數(shù)的3個參數(shù),,參數(shù)間用逗號間隔。 如果改寫為 printf('%d,,%d,,%d',(a,,b,,c),b,,c),; 則 (a,b,,c)是一個逗號表達式,,它的值等于c的值。括弧內(nèi)的逗號不是參數(shù)間的分隔符而是逗號運算符,。括弧中的內(nèi)容是一個整體,,作為printf函數(shù)的一個參數(shù)。 |
|