C語言的內(nèi)部運(yùn)算符很豐富,運(yùn)算符是告訴編譯程序執(zhí)行特定算術(shù)或邏輯操作的符號。C語言有三大運(yùn)算符:算術(shù)、關(guān)系與邏輯、位操作。另外,C還有一些特殊的運(yùn)算符,用于完成一些特殊的任務(wù)。
2.6.1算術(shù)運(yùn)算符
表2-5列出了C語言中允許的算術(shù)運(yùn)算符。在C語言中,運(yùn)算符“+”、“-”、“*”和“/”的用法與大多數(shù)計算機(jī)語言的相同,幾乎可用于所有C語言內(nèi)定義的數(shù)據(jù)類型。當(dāng)“/”被用于整數(shù)或字符時,結(jié)果取整。例如,在整數(shù)除法中,10/3=3。
一元減法的實(shí)際效果等于用-1乘單個操作數(shù),即任何數(shù)值前放置減號將改變其符號。模運(yùn)算符“%”在C語言中也同它在其它語言中的用法相同。切記,模運(yùn)算取整數(shù)除法的余數(shù),所以“%”不能用于float和double類型。
最后一行打印一個0和一個1,因?yàn)?/2整除時為0,余數(shù)為1,故1%2取余數(shù)1。
2.6.2自增和自減
C語言中有兩個很有用的運(yùn)算符,通常在其它計算機(jī)語言中是找不到它們的—自增和自減運(yùn)算符,++和--。運(yùn)算符“++”是操作數(shù)加1,而“--”是操作數(shù)減1,換句話說:x=x+1;同++x;x=x-1;同--x;
自增和自減運(yùn)算符可用在操作數(shù)之前,也可放在其后,例如:x=x+1;可寫成++x;或x++;但在表達(dá)式中這兩種用法是有區(qū)別的。自增或自減運(yùn)算符在操作數(shù)之前,C語言在引用操作數(shù)之前就先執(zhí)行加1或減1操作;運(yùn)算符在操作數(shù)之后,C語言就先引用操作數(shù)的值,而后再進(jìn)行加1或減1操作。請看下例:
x=10;
;y=++x;
此時,y=11。如果程序改為:
x=10;y=x++;
則y=10。在這兩種情況下,x都被置為11,但區(qū)別在于設(shè)置的時刻,這種對自增和自減發(fā)生時刻的控制是非常有用的。在大多數(shù)C編譯程序中,為自增和自減操作生成的程序代碼比等價的賦值語句生成的代碼
要快得多,所以盡可能采用加1或減1運(yùn)算符是一種好的選擇。
。下面是算術(shù)運(yùn)算符的優(yōu)先級:
:++、-
--
-(一元減)
*、/、%最低+、-編譯程序?qū)ν夁\(yùn)算符按從左到右的順序進(jìn)行計算。當(dāng)然,括號可改變計算順序。C語言
處理括號的方法與幾乎所有的計算機(jī)語言相同:強(qiáng)迫某個運(yùn)算或某組運(yùn)算的優(yōu)先級升高。
2.6.3關(guān)系和邏輯運(yùn)算符
關(guān)系運(yùn)算符中的“關(guān)系”二字指的是一個值與另一個值之間的關(guān)系,邏輯運(yùn)算符中的“邏輯”二字指的是連接關(guān)系的方式。因?yàn)殛P(guān)系和邏輯運(yùn)算符常在一起使用,所以將它們放在一起討論。關(guān)系和邏輯運(yùn)算符概念中的關(guān)鍵是True(真)和Flase(假)。C語言中,非0為True,0為Flase。使用關(guān)系或邏輯運(yùn)算符的表達(dá)式對Flase和Ture分別返回值0或1(見表2-6)。
表2-6給出于關(guān)系和邏輯運(yùn)算符,下面用1和0給出邏輯真值表。關(guān)系和邏輯運(yùn)算符的優(yōu)先級比算術(shù)運(yùn)算符低,即像表達(dá)式10>1+12的計算可以假定是對表達(dá)式10>(1+12)的計算,當(dāng)然,該表達(dá)式的結(jié)果為Flase。在一個表達(dá)式中允許運(yùn)算的組合。例如:
10>5&&!(10<9)||3<=4
這一表達(dá)式的結(jié)果為True。
。下表給出了關(guān)系和邏輯運(yùn)算符的相對優(yōu)先級:
:!
!
>= <=
=== !=
=&&
最低||同算術(shù)表達(dá)式一樣,在關(guān)系或邏輯表達(dá)式中也使用括號來修改原計算順序。切記,所有關(guān)系和邏輯表達(dá)式產(chǎn)生的結(jié)果不是0就是1,所以下面的程序段不僅正確而且
將在屏幕上打印數(shù)值1。
int x;
;x=100;
;printf("%d",x>10);
2.6.4位操作符
與其它語言不同,C語言支持全部的位操作符(BitwiseOperators)。因?yàn)镃語言的設(shè)計目的是取代匯編語言,所以它必須支持匯編語言所具有的運(yùn)算能力。位操作是對字節(jié)或字中的位(bit)進(jìn)行測試、置位或移位處理,這里字節(jié)或字是針對C標(biāo)準(zhǔn)中的char和int數(shù)據(jù)類型而言的。位操作不能用于float、double、longdouble、void或其它復(fù)雜類型。表2-7給出了位操作的操作符。位操作中的AND、OR和NOT(1的補(bǔ)碼)的真值表與邏輯運(yùn)算等價,不同的是位操作是逐位進(jìn)行運(yùn)算的。
如表2-8所示,當(dāng)且僅當(dāng)一個操作數(shù)為True時,異或的輸出為True,否則為Flase。
位操作通常用于設(shè)備驅(qū)動程序,例如調(diào)制解調(diào)器程序、磁盤文件管理程序和打印機(jī)驅(qū)動程序。這是因?yàn)槲徊僮骺善帘蔚裟承┪?,如奇偶校?yàn)位(奇偶校驗(yàn)位用于確保字節(jié)中的其它位不會發(fā)生錯誤通常奇偶校驗(yàn)位是字節(jié)的位)。
通常我們可把位操作AND作為關(guān)閉位的手段,這就是說兩個操作數(shù)中任一為0的位,其結(jié)果中對應(yīng)位置為0。例如,下面的函數(shù)通過調(diào)用函數(shù)read_modem(),從調(diào)制解調(diào)器端口讀入一個字符,并將奇偶校驗(yàn)位置成0。
字節(jié)的位8是奇偶位,將該字節(jié)與一個位1到位7為1、位8為0的字節(jié)進(jìn)行與操作,可將該字節(jié)的奇偶校驗(yàn)位置成0。表達(dá)式ch&127正是將ch中每一位同127數(shù)字的對應(yīng)位進(jìn)行與操作,結(jié)果ch的位8被置成了0。在下面的例子中,假定ch接收到字符"A"并且奇偶位已經(jīng)被置位。
一般來說,位的AND、OR和XOR操作通過對操作數(shù)運(yùn)算,直接對結(jié)果變量的每一位分別處理。正是因?yàn)檫@一原因(還有其它一些原因),位操作通常不像關(guān)系和邏輯運(yùn)算符那樣用在條件語句中,我們可以用例子說明這一點(diǎn):假定X=7,那么x&&8為Ture(1),而x&8卻為Flase(0)。
記住,關(guān)系和邏輯操作符結(jié)果不是0就是1。而相似的位操作通過相應(yīng)處理,結(jié)果可為任意值。換言之,位操作可以有0或1以外的其它值,而邏輯運(yùn)算符的計算結(jié)果總是0或1。
移位操作符>>和<<將變量的各位按要求向或向左移動。右移語句通常形式是:
variable>>右移位數(shù)
2.6.1算術(shù)運(yùn)算符
表2-5列出了C語言中允許的算術(shù)運(yùn)算符。在C語言中,運(yùn)算符“+”、“-”、“*”和“/”的用法與大多數(shù)計算機(jī)語言的相同,幾乎可用于所有C語言內(nèi)定義的數(shù)據(jù)類型。當(dāng)“/”被用于整數(shù)或字符時,結(jié)果取整。例如,在整數(shù)除法中,10/3=3。
一元減法的實(shí)際效果等于用-1乘單個操作數(shù),即任何數(shù)值前放置減號將改變其符號。模運(yùn)算符“%”在C語言中也同它在其它語言中的用法相同。切記,模運(yùn)算取整數(shù)除法的余數(shù),所以“%”不能用于float和double類型。
最后一行打印一個0和一個1,因?yàn)?/2整除時為0,余數(shù)為1,故1%2取余數(shù)1。
2.6.2自增和自減
C語言中有兩個很有用的運(yùn)算符,通常在其它計算機(jī)語言中是找不到它們的—自增和自減運(yùn)算符,++和--。運(yùn)算符“++”是操作數(shù)加1,而“--”是操作數(shù)減1,換句話說:x=x+1;同++x;x=x-1;同--x;
自增和自減運(yùn)算符可用在操作數(shù)之前,也可放在其后,例如:x=x+1;可寫成++x;或x++;但在表達(dá)式中這兩種用法是有區(qū)別的。自增或自減運(yùn)算符在操作數(shù)之前,C語言在引用操作數(shù)之前就先執(zhí)行加1或減1操作;運(yùn)算符在操作數(shù)之后,C語言就先引用操作數(shù)的值,而后再進(jìn)行加1或減1操作。請看下例:
x=10;
;y=++x;
此時,y=11。如果程序改為:
x=10;y=x++;
則y=10。在這兩種情況下,x都被置為11,但區(qū)別在于設(shè)置的時刻,這種對自增和自減發(fā)生時刻的控制是非常有用的。在大多數(shù)C編譯程序中,為自增和自減操作生成的程序代碼比等價的賦值語句生成的代碼
要快得多,所以盡可能采用加1或減1運(yùn)算符是一種好的選擇。
。下面是算術(shù)運(yùn)算符的優(yōu)先級:
:++、-
--
-(一元減)
*、/、%最低+、-編譯程序?qū)ν夁\(yùn)算符按從左到右的順序進(jìn)行計算。當(dāng)然,括號可改變計算順序。C語言
處理括號的方法與幾乎所有的計算機(jī)語言相同:強(qiáng)迫某個運(yùn)算或某組運(yùn)算的優(yōu)先級升高。
2.6.3關(guān)系和邏輯運(yùn)算符
關(guān)系運(yùn)算符中的“關(guān)系”二字指的是一個值與另一個值之間的關(guān)系,邏輯運(yùn)算符中的“邏輯”二字指的是連接關(guān)系的方式。因?yàn)殛P(guān)系和邏輯運(yùn)算符常在一起使用,所以將它們放在一起討論。關(guān)系和邏輯運(yùn)算符概念中的關(guān)鍵是True(真)和Flase(假)。C語言中,非0為True,0為Flase。使用關(guān)系或邏輯運(yùn)算符的表達(dá)式對Flase和Ture分別返回值0或1(見表2-6)。
表2-6給出于關(guān)系和邏輯運(yùn)算符,下面用1和0給出邏輯真值表。關(guān)系和邏輯運(yùn)算符的優(yōu)先級比算術(shù)運(yùn)算符低,即像表達(dá)式10>1+12的計算可以假定是對表達(dá)式10>(1+12)的計算,當(dāng)然,該表達(dá)式的結(jié)果為Flase。在一個表達(dá)式中允許運(yùn)算的組合。例如:
10>5&&!(10<9)||3<=4
這一表達(dá)式的結(jié)果為True。
。下表給出了關(guān)系和邏輯運(yùn)算符的相對優(yōu)先級:
:!
!
>= <=
=== !=
=&&
最低||同算術(shù)表達(dá)式一樣,在關(guān)系或邏輯表達(dá)式中也使用括號來修改原計算順序。切記,所有關(guān)系和邏輯表達(dá)式產(chǎn)生的結(jié)果不是0就是1,所以下面的程序段不僅正確而且
將在屏幕上打印數(shù)值1。
int x;
;x=100;
;printf("%d",x>10);
2.6.4位操作符
與其它語言不同,C語言支持全部的位操作符(BitwiseOperators)。因?yàn)镃語言的設(shè)計目的是取代匯編語言,所以它必須支持匯編語言所具有的運(yùn)算能力。位操作是對字節(jié)或字中的位(bit)進(jìn)行測試、置位或移位處理,這里字節(jié)或字是針對C標(biāo)準(zhǔn)中的char和int數(shù)據(jù)類型而言的。位操作不能用于float、double、longdouble、void或其它復(fù)雜類型。表2-7給出了位操作的操作符。位操作中的AND、OR和NOT(1的補(bǔ)碼)的真值表與邏輯運(yùn)算等價,不同的是位操作是逐位進(jìn)行運(yùn)算的。
如表2-8所示,當(dāng)且僅當(dāng)一個操作數(shù)為True時,異或的輸出為True,否則為Flase。
位操作通常用于設(shè)備驅(qū)動程序,例如調(diào)制解調(diào)器程序、磁盤文件管理程序和打印機(jī)驅(qū)動程序。這是因?yàn)槲徊僮骺善帘蔚裟承┪?,如奇偶校?yàn)位(奇偶校驗(yàn)位用于確保字節(jié)中的其它位不會發(fā)生錯誤通常奇偶校驗(yàn)位是字節(jié)的位)。
通常我們可把位操作AND作為關(guān)閉位的手段,這就是說兩個操作數(shù)中任一為0的位,其結(jié)果中對應(yīng)位置為0。例如,下面的函數(shù)通過調(diào)用函數(shù)read_modem(),從調(diào)制解調(diào)器端口讀入一個字符,并將奇偶校驗(yàn)位置成0。
字節(jié)的位8是奇偶位,將該字節(jié)與一個位1到位7為1、位8為0的字節(jié)進(jìn)行與操作,可將該字節(jié)的奇偶校驗(yàn)位置成0。表達(dá)式ch&127正是將ch中每一位同127數(shù)字的對應(yīng)位進(jìn)行與操作,結(jié)果ch的位8被置成了0。在下面的例子中,假定ch接收到字符"A"并且奇偶位已經(jīng)被置位。
一般來說,位的AND、OR和XOR操作通過對操作數(shù)運(yùn)算,直接對結(jié)果變量的每一位分別處理。正是因?yàn)檫@一原因(還有其它一些原因),位操作通常不像關(guān)系和邏輯運(yùn)算符那樣用在條件語句中,我們可以用例子說明這一點(diǎn):假定X=7,那么x&&8為Ture(1),而x&8卻為Flase(0)。
記住,關(guān)系和邏輯操作符結(jié)果不是0就是1。而相似的位操作通過相應(yīng)處理,結(jié)果可為任意值。換言之,位操作可以有0或1以外的其它值,而邏輯運(yùn)算符的計算結(jié)果總是0或1。
移位操作符>>和<<將變量的各位按要求向或向左移動。右移語句通常形式是:
variable>>右移位數(shù)