c第三章表達(dá)式和語(yǔ)句_第1頁(yè)
c第三章表達(dá)式和語(yǔ)句_第2頁(yè)
c第三章表達(dá)式和語(yǔ)句_第3頁(yè)
c第三章表達(dá)式和語(yǔ)句_第4頁(yè)
c第三章表達(dá)式和語(yǔ)句_第5頁(yè)
已閱讀5頁(yè),還剩40頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 第二章 表達(dá)式和語(yǔ)句 3.1 表達(dá)式 1. 表達(dá)式的概述 表達(dá)式時(shí)操作符、操作數(shù)和標(biāo)點(diǎn)符號(hào)組成的序列,其目的 時(shí)用來(lái)說(shuō)明一個(gè)計(jì)算過(guò)程。 表達(dá)式可以嵌套,例如:2 + 3 + (5 * sizeof(int) / 345。 表達(dá)式根據(jù)某些約定、求值次序、結(jié)合和優(yōu)先級(jí)規(guī)則來(lái)進(jìn) 行計(jì)算。 所謂約定,即類(lèi)型轉(zhuǎn)換的約定。例如: float a; a = 5 / 2 ; 結(jié)果a得到值為2。5 /2 是整數(shù)除法取整,因?yàn)?和2都是整 數(shù),不會(huì)由于a是float型而輕易改變運(yùn)算的性質(zhì)。 所謂求值次序,是指表達(dá)式中各個(gè)操作數(shù)的求值次序視 編譯器不同而不同。 所謂結(jié)合性,是指表達(dá)式中出現(xiàn)同等優(yōu)先級(jí)的操作符時(shí) ,

2、該先做哪個(gè)操作的規(guī)定。例如: d = a + b c ; /C+規(guī)定,加減法先左后右。先做a + b,其結(jié)果再減去c d = a = 3 ; /C+規(guī)定,等號(hào)先右后左。先做a = 3,其結(jié)果再賦給d 所謂優(yōu)先級(jí),是指不同優(yōu)先級(jí)的操作符,總是先做優(yōu)先 級(jí)高的操作。例如: d = a + b * c ; / 乘法優(yōu)先級(jí)比加法高。先做b * c,其結(jié)果再與a相加 2.左值和右值 左值是能出現(xiàn)在賦值表達(dá)式左邊的表達(dá)式。左值表達(dá)式 具有存放數(shù)據(jù)的空間,并且存放是允許的。例如: int a = 3 ; /a是變量,所以a是左值 const int b = 4 ; /b是常量,所以b不是左值 顯然常量不是左

3、值,因?yàn)镃+規(guī)定常量的值一旦確定是 不能更改的。 右值能出現(xiàn)在賦值表達(dá)式的右邊。左值表達(dá)式也可以作 為右值表達(dá)式。例如: int a , b = 6 ; a = b ; /b是變量,所以是左值,此處作為右值 a = 8 ; /8是常量,只能作為右值,不能作為左值 3.優(yōu)先級(jí)和結(jié)合性 下表包含了C+所有的操作符,共有16級(jí)優(yōu)先級(jí)。 每一級(jí)中的操作符是同優(yōu)先級(jí)的。 4.語(yǔ)句與塊 C+中所有的操作運(yùn)算都能通過(guò)表達(dá)式來(lái)實(shí)現(xiàn)。由表達(dá) 式組成的語(yǔ)句稱(chēng)為表達(dá)式語(yǔ)句,它由一個(gè)表達(dá)式后接一個(gè)分 號(hào)“;”組成。 通過(guò)計(jì)算表達(dá)式即執(zhí)行了表達(dá)式語(yǔ)句。 語(yǔ)句可以是空語(yǔ)句??照Z(yǔ)句是只有一個(gè)分號(hào)而沒(méi)有表達(dá) 式的語(yǔ)句,其形式

4、為: ; 它不產(chǎn)生任何操作運(yùn)算,只作為形式上的語(yǔ)句,被填充 在控制結(jié)構(gòu)中。例如: if( x 9 ) ; else cout 9 ) cout“The number is perfect.n”; cout“It is larger than 9n”; else cout“not larger than 9n”; 上面兩條執(zhí)行語(yǔ)句必須放在花括號(hào)中,因?yàn)閕f與else之 間只能容納一條語(yǔ)句,或一個(gè)語(yǔ)句塊。而else后面的花括號(hào) 則可以省略。 3.2 算術(shù)運(yùn)算和賦值 操作符種類(lèi) C+提供了算術(shù)運(yùn)算符 + , - , * , / , % 。 + , - , *是通常意義的加、減、乘法。 /對(duì)于整型數(shù)則

5、為除法取整操作。例如:5/2得到結(jié)果2。 /對(duì)于浮點(diǎn)數(shù)則為通常意義的除法。例如:5.0/2.0得到結(jié) 果為2.5。 由此可見(jiàn),/操作符可以對(duì)不同的數(shù)據(jù)類(lèi)型進(jìn)行不同的 操作。事實(shí)上, + , - , * , / , % 對(duì)不同數(shù)據(jù)類(lèi)型的操作都不 同。 只能對(duì)整型數(shù)進(jìn)行操作。其操作意義為取余。例如 52得到結(jié)果為1。 不允許對(duì)浮點(diǎn)數(shù)操作,如果對(duì)浮點(diǎn)數(shù)操作,則引起編 譯錯(cuò)誤。 2.賦值縮寫(xiě) 算術(shù)表達(dá)式的賦值表示為: int x , y , z ; x = y * z ; x = y / z ; x = y + z ; x = y z ; x = y % z ; 當(dāng)一個(gè)變量既出現(xiàn)在表達(dá)式的左邊又出現(xiàn)在

6、右邊時(shí),可 以縮寫(xiě)。例如: x = x * y ; 縮寫(xiě)為: x * = y ; x = x + y ; 縮寫(xiě)為: x + = y ; x = x - y ; 縮寫(xiě)為: x - = y ; x = x / y ; 縮寫(xiě)為: x / = y ; x = x % y ; 縮寫(xiě)為: x % = y ; 3.溢出 進(jìn)行算術(shù)運(yùn)算時(shí),很可能溢出結(jié)果。發(fā)生溢出是由于 一個(gè)變量被賦予一個(gè)超出其數(shù)據(jù)類(lèi)型表示范圍的數(shù)值。數(shù) 值溢出不會(huì)引起編譯錯(cuò)誤的,只要分母不為0就不會(huì)引起除 0進(jìn)行故障,但人使運(yùn)行結(jié)果發(fā)生偏差。 例如,在16位機(jī)器上進(jìn)行下面的操作: int weight = 42896 ; 在16位機(jī)器中將不能

7、得到值42896,而是-22640。因?yàn)?有符號(hào)整數(shù)的表示范圍是-3276832767。 3.3算術(shù)類(lèi)型轉(zhuǎn)換 C+遇到兩種不同數(shù)據(jù)類(lèi)型的數(shù)值進(jìn)行計(jì)算時(shí),會(huì)將兩 個(gè)數(shù)作適當(dāng)?shù)念?lèi)型轉(zhuǎn)換,然后再進(jìn)行運(yùn)算。轉(zhuǎn)換的方向見(jiàn)下 圖: 如果一個(gè)char型數(shù)和一個(gè)int型數(shù)相加,則將char型數(shù)轉(zhuǎn) 換成int型數(shù),然后進(jìn)行運(yùn)算。如果一個(gè)long int型數(shù)和一個(gè) float型數(shù)相加,則先將兩個(gè)數(shù)據(jù)類(lèi)型都轉(zhuǎn)換成double型數(shù), 然后進(jìn)行運(yùn)算。如果一個(gè) int 型數(shù)和一個(gè)unsigned long 型數(shù) 相乘,則先將兩數(shù)都轉(zhuǎn)換成double 型數(shù),然后進(jìn)行運(yùn)算。 轉(zhuǎn)換總是朝表達(dá)數(shù)據(jù)能力更強(qiáng)的方向,并且轉(zhuǎn)換總是逐

8、個(gè)運(yùn)算進(jìn)行的。例如: float f = 3.5 ; int n = 6 ; long k = 21 ; double ss = f * n + k / 2 ; ss將會(huì)得到結(jié)果31。計(jì)算ss時(shí),首先將f(float型)和n(int 型)轉(zhuǎn)換成double 型數(shù),算的21,然后計(jì)算 k/2 的整除運(yùn)算結(jié) 果10(long int 型),再將long int 型的數(shù)字10轉(zhuǎn)換成double 型數(shù)。 數(shù)據(jù)運(yùn)算過(guò)程中自動(dòng)進(jìn)行的類(lèi)型轉(zhuǎn)換稱(chēng)為隱式類(lèi)型轉(zhuǎn)換 。上例的表達(dá)式運(yùn)算過(guò)程中進(jìn)行的數(shù)據(jù)類(lèi)型轉(zhuǎn)換就是隱式轉(zhuǎn) 換。 有時(shí)候,我們會(huì)面臨現(xiàn)面計(jì)算結(jié)果不正確的問(wèn)題: long m = 234 * 456 / 6

9、; 即發(fā)現(xiàn)m為-4061,而不是17784。原因式語(yǔ)句先進(jìn)行int 型數(shù)的乘法運(yùn)算,結(jié)果仍以int 型數(shù)保留起來(lái),中間結(jié)果有一 個(gè)被截?cái)嗟倪^(guò)程,所以,最后的結(jié)果式錯(cuò)的。如果讓第1次乘 法的結(jié)果以long 型數(shù)保留下來(lái),就能得到正確的結(jié)果。這就 要求參加乘法運(yùn)算的2個(gè)數(shù)中至少有一個(gè)為long 型數(shù)。 例如,將其中之一標(biāo)識(shí)以L或l(long),則可保證其正確 cout234 * 456L/6 endl; 輸出結(jié)果為: 17784 還可以將整型數(shù)強(qiáng)制轉(zhuǎn)換為long 型: cout (long)234*456/6endl; 該語(yǔ)句使234成為long型數(shù),與整數(shù)456相乘,先隱式轉(zhuǎn) 換,再相乘,得到一

10、個(gè)long型數(shù)106704。再與6相除取整,從 而得到正確結(jié)果。 強(qiáng)制轉(zhuǎn)換又稱(chēng)顯示轉(zhuǎn)換,其語(yǔ)法式在一個(gè)數(shù)值或變量前 加上帶括號(hào)的類(lèi)型名。也可以類(lèi)型名后跟帶括號(hào)的數(shù)值或表 達(dá)式(C不可以)。如上面的語(yǔ)句也可以寫(xiě)成: coutlong(234) * 456 / 6endl; 如果類(lèi)型名是帶類(lèi)型修飾的,則要給類(lèi)型名加括號(hào)。例 如: cout(unsigned long )234 * 456 / 6endl; coutunsigned long (234) * 456 / 6endl; /error 注意下面語(yǔ)句不能產(chǎn)生所期望的效果: coutlong(234*456)/6endl; 該語(yǔ)句首先執(zhí)行括

11、號(hào)里的乘法,得到一個(gè)int型整數(shù), 然后強(qiáng)制轉(zhuǎn)換為long型數(shù),再參加除6取整運(yùn)算,所以得不 到正確結(jié)果。 3.4增量和減量 增量和減量操作符表示為:+和-。 增量操作表示加1,減量操作表示減1。例如: a+ ; /相當(dāng)于a = a + 1; +a ; /相當(dāng)于a = a + 1; a- ; /相當(dāng)于a = a 1 ; -a ; /相當(dāng)于a = a 1; 增量操作符有前增量與后增量之分。前增量操作+a的 意義為:先修改操作數(shù)使之增1,然后將增1過(guò)的a值作為表 達(dá)式的值。而后增量操作a+的意義為:先將變量a的值作為 表達(dá)式的值確定下來(lái),再將a增1。對(duì)于增量和減量操作符, 它要求操作數(shù)是左值,因?yàn)?/p>

12、操作數(shù)的值要發(fā)生變化。例如: int a = 3 ; int b = +a ; couta“ ”bendl; int c = a+ ; couta“ ”c) 小于(=) 小于等于(=,= ,!=, , 比較操作符產(chǎn)生的值是比較的結(jié)果,可能是0或1,即假或 真。 真和假是邏輯值。在C+中,假意味著0,真意味著非0。 所以,任意一個(gè)非0數(shù)都是真,表示為邏輯值就是1。例如: x = somevalue; if(x=9) cout“x is not 0n”; 例中,不管x的初值是什么,總是執(zhí)行cout語(yǔ)句。因?yàn)閤=9 是賦值表達(dá)式,其表達(dá)式的值是所賦的值9,而9為非0值,所 以if語(yǔ)句的條件為真,所以

13、總是執(zhí)行cout語(yǔ)句。又例如: x = somevalue; if(x=0) cout“x is 0n”; 例中,不管x以前是什么值,總是不會(huì)執(zhí)行cout語(yǔ)句。因 為x=0是賦值表達(dá)式,并且其值為0,為假。 3.不等于運(yùn)算符 當(dāng)要測(cè)試一些東西不是真時(shí),可以使用不等于操作符。例 如,如果要在一些東西是真時(shí)在屏幕上顯示一則消息,則可以 用如下語(yǔ)句: if(x!=9) cout“x is not 9n”; 要注意的是,如果顛倒!=,則意義完全不同: if(x=!9) cout“x is not 9n”; 該if條件表達(dá)式是一個(gè)賦值語(yǔ)句,!9為非真,即0。所以條 件表達(dá)式相當(dāng)于if(x=0),于是co

14、ut語(yǔ)句永遠(yuǎn)也不會(huì)執(zhí)行。 4.嵌入賦值 有時(shí)候,需要將一個(gè)函數(shù)值賦給一個(gè)變量,然后比較該變 量的值與預(yù)定值是否相等。例如: x=func(); if(xsomevalue) /語(yǔ)句 上面的代碼與下面的代碼等價(jià): if(x=func()somevalue) /語(yǔ)句 因?yàn)橐ox賦值,然后確定x的值,所以先進(jìn)行賦值。賦 值表達(dá)式的值即x的值可以作為比較的操作數(shù)。這里,由于 操作比操作優(yōu)先級(jí)高,所以需要額外加一個(gè)括號(hào)。 這種賦值緊接著比較的表達(dá)式稱(chēng)為嵌入賦值。 5.邏輯非運(yùn)算符 !改變條件表達(dá)式的真假值,即邏輯運(yùn)算的“非”。原來(lái) 是0,則!0為1;原來(lái)為非0,則!操作使之變?yōu)?。例如: if(!(x9

15、) cout=80 if(temp80) cout=優(yōu)先級(jí)低,所以if中的條件表達(dá)式為先求 temp=80和humi=50,然后進(jìn)行邏輯與 if(n4 cout“m = ”m4的比較值為0,所以整個(gè)if表達(dá)式的值不用看后面 就知道為0。C+利用這個(gè)特點(diǎn)以產(chǎn)生高效的代碼。所以,后 面的表達(dá)式不被執(zhí)行。這樣,m的值還是6而不是7。知道了 短路表達(dá)式在C+中的處理方式,就可以在編寫(xiě)程序時(shí),不 但避免不比較的錯(cuò)誤,而且還可利用它。例如: if(b!=0 例中如果temp80的關(guān)系比較 ,直接執(zhí)行輸出語(yǔ)句。 3.6 if語(yǔ)句 1. If語(yǔ)句 if語(yǔ)句的語(yǔ)法為: if(條件表達(dá)式) 語(yǔ)句; 或: if(條

16、件表達(dá)式) 語(yǔ)句; 它的意義為:如果條件表達(dá)式進(jìn)行一次測(cè)試,且測(cè)試為真 ,則執(zhí)行后面的語(yǔ)句。 如果if語(yǔ)句只控制一條語(yǔ)句,則包圍該語(yǔ)句的花括號(hào)不是 必需的。 2.空語(yǔ)句 編譯器必須在if條件表達(dá)式的后面找到一個(gè)作為語(yǔ)句結(jié)束 符的分號(hào)“;”,以標(biāo)志if語(yǔ)句的結(jié)束。這樣,如果是下面的 代碼: if(條件表達(dá)式) ; 語(yǔ)句; 則不管條件表達(dá)式為真為假,總是接著執(zhí)行語(yǔ)句。 3. ifelse語(yǔ)句 語(yǔ)法為: if(條件表達(dá)式) /語(yǔ)句1; else /語(yǔ)句2; ifelse語(yǔ)句結(jié)構(gòu) 4.解決二義性 如果有下面的代碼: int x = 20; if(x=0) if(x50) cout“x is okn”;

17、 else cout=0) if(x50) cout“x is okn”; else cout=0) if(x50) cout“x is okn”; else cout“x is not okn”; C+規(guī)定,ifelse語(yǔ)句成對(duì)的規(guī)則是:else連接到上面第 1個(gè)沒(méi)有配對(duì)的且為可見(jiàn)的if上。所以上例的else應(yīng)屬于第二個(gè) if語(yǔ)句,即第一種解釋。 又例如: if(條件) if(條件) if(條件) 語(yǔ)句; else 語(yǔ)句; 上例的else連到第2個(gè)if上,因?yàn)榈?個(gè)if不可見(jiàn)。第2個(gè)if 是else最先碰到的沒(méi)有配對(duì)過(guò)的if。 3.7 條件運(yùn)算符 條件運(yùn)算符的語(yǔ)法為: (條件表達(dá)式)?(條件

18、為真時(shí)的表達(dá)式):(條件為假時(shí)的表達(dá)式) 例如: x=ab?a:b; 條件運(yùn)算符構(gòu)成一個(gè)表達(dá)式。它是C+中唯一一個(gè)3目運(yùn) 算符,它們之間用“?”和“:”隔開(kāi)。上例中,把a(bǔ)和b中 較小的值賦給x。該例是ifelse語(yǔ)句的一個(gè)替代: if(ab) x=a; else x=b; 條件運(yùn)算符構(gòu)成的表達(dá)式,它是有值的。而ifelse語(yǔ)句不 能有值,所以ifelse語(yǔ)句不能替代條件運(yùn)算符。例如,下面的 代碼不能由ifelse替代: cout(ab?a:b)endl; 輸出語(yǔ)句要打印一個(gè)值,該值是a與b的較小值。由于 優(yōu)先級(jí)高于條件運(yùn)算符,所以輸出語(yǔ)句中要將條件運(yùn)算符構(gòu)成 的表達(dá)式用括號(hào)括起來(lái)。 條件運(yùn)算符

19、表達(dá)式的值與測(cè)試值沒(méi)有直接的關(guān)系。例如: cout(number1?”file”:”files”)y?”greater than ”:xy?”equal to”:”less than” 它等價(jià)于: (xy)?”greater than”:(xy)?”equal to”:”less than”) 當(dāng)xy時(shí),值為“greater than”,xy時(shí),值為“equal to”, 否則,值為“l(fā)ess than”。條件運(yùn)算符的嵌套可讀性不夠好。 在一個(gè)條件運(yùn)算符的表達(dá)式中,如果后面兩個(gè)表達(dá)式的值 類(lèi)型相同,均為左值,則該條件運(yùn)算符表達(dá)式的值為左值表達(dá) 式。例如: int x=5; long a,b;

20、(x?a:b)=1; (x?x:a)=2; (x2?1:a)=3; 任何被轉(zhuǎn)換的變量都不是左值。 在C中,條件運(yùn)算符不能作左值的。 3.8 逗號(hào)表達(dá)式 逗號(hào)表達(dá)式的語(yǔ)法為: 表達(dá)式1,表達(dá)式2,表達(dá)式n C+順序計(jì)算表達(dá)式1,表達(dá)式2,表達(dá)式n的值。 例如: int a,b,c; a=1,b=a+2,c=b+3; 由于按順序求值,所以能夠保證b一定在a賦值之后,c一 定在b賦值之后。該逗號(hào)表達(dá)式可以用下面3個(gè)有序的賦值語(yǔ) 句來(lái)表示: a=1; b=a+2; c=b+3; 逗號(hào)表達(dá)式是有值的,這一點(diǎn)是語(yǔ)句所不能代替的。逗 號(hào)表達(dá)式的值為第n個(gè)子表達(dá)式的值,即表達(dá)式n的值。例如 int a,b,c

21、,d; d=(a=1,b=a+2,c=b+3); coutdendl; 輸出結(jié)果為: 6 上例中輸出的結(jié)果d即為c的值。 逗號(hào)表達(dá)式還可以用于函數(shù)調(diào)用中的參數(shù)。例如: func(n,(j=1,j+4),k); 該函數(shù)調(diào)用有3個(gè)參數(shù),中間的參數(shù)是一個(gè)逗號(hào)表達(dá)式。 括號(hào)是必須的,否則,該函數(shù)有4個(gè)參數(shù)了。逗號(hào)表達(dá)式 作為值的形式,可以用于幾乎所有的地方。 C+中,如果逗號(hào)表達(dá)式的最后一個(gè)表達(dá)式為左值,則該 逗號(hào)表達(dá)式為左值。例如: (a=1,b,c+1,d)=5; /ok:即d=5 在C中,逗號(hào)表達(dá)式是不能作左值的。 3.9 求值次序與副作用 不同的編譯器求值順序不同 例如: int a=3,b=5,c; c=a*b+ +b; coutcendl; 該程序段在BC中運(yùn)行得到24,而在VC中運(yùn)行卻得到21。 求值順序使交換律失去作用 加法操作我們都知道a+b=b+a。也就是說(shuō),交換律成立。 在C+中對(duì)簡(jiǎn)單的表達(dá)式,交換律是成立,但對(duì)復(fù)合表達(dá)式, 交換律未必成立。例如: c=a*b+ +b; 與: c=+b+a*b; 在VC中,運(yùn)行結(jié)果前者為21,后者為24。 3. 求值順序使括號(hào)失去作用 在表達(dá)式中括號(hào)的優(yōu)先級(jí)使最高的。例如,a*(b+c)中, 先做加法,后做乘法。在C+中,簡(jiǎn)單的表達(dá)式括號(hào)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論