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

下載本文檔

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

文檔簡介

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

2、該先做哪個(gè)操作的規(guī)定。例如: d = a + b c ; /C+規(guī)定,加減法先左后右。先做a + b,其結(jié)果再減去c d = a = 3 ; /C+規(guī)定,等號先右后左。先做a = 3,其結(jié)果再賦給d 所謂優(yōu)先級,是指不同優(yōu)先級的操作符,總是先做優(yōu)先 級高的操作。例如: d = a + b * c ; / 乘法優(yōu)先級比加法高。先做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)先級和結(jié)合性 下表包含了C+所有的操作符,共有16級優(yōu)先級。 每一級中的操作符是同優(yōu)先級的。 4.語句與塊 C+中所有的操作運(yùn)算都能通過表達(dá)式來實(shí)現(xiàn)。由表達(dá) 式組成的語句稱為表達(dá)式語句,它由一個(gè)表達(dá)式后接一個(gè)分 號“;”組成。 通過計(jì)算表達(dá)式即執(zhí)行了表達(dá)式語句。 語句可以是空語句??照Z句是只有一個(gè)分號而沒有表達(dá) 式的語句,其形式

4、為: ; 它不產(chǎn)生任何操作運(yùn)算,只作為形式上的語句,被填充 在控制結(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àn)閕f與else之 間只能容納一條語句,或一個(gè)語句塊。而else后面的花括號 則可以省略。 3.2 算術(shù)運(yùn)算和賦值 操作符種類 C+提供了算術(shù)運(yùn)算符 + , - , * , / , % 。 + , - , *是通常意義的加、減、乘法。 /對于整型數(shù)則

5、為除法取整操作。例如:5/2得到結(jié)果2。 /對于浮點(diǎn)數(shù)則為通常意義的除法。例如:5.0/2.0得到結(jié) 果為2.5。 由此可見,/操作符可以對不同的數(shù)據(jù)類型進(jìn)行不同的 操作。事實(shí)上, + , - , * , / , % 對不同數(shù)據(jù)類型的操作都不 同。 只能對整型數(shù)進(jìn)行操作。其操作意義為取余。例如 52得到結(jié)果為1。 不允許對浮點(diǎn)數(shù)操作,如果對浮點(diǎn)數(shù)操作,則引起編 譯錯誤。 2.賦值縮寫 算術(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í),可 以縮寫。例如: x = x * y ; 縮寫為: x * = y ; x = x + y ; 縮寫為: x + = y ; x = x - y ; 縮寫為: x - = y ; x = x / y ; 縮寫為: x / = y ; x = x % y ; 縮寫為: x % = y ; 3.溢出 進(jìn)行算術(shù)運(yùn)算時(shí),很可能溢出結(jié)果。發(fā)生溢出是由于 一個(gè)變量被賦予一個(gè)超出其數(shù)據(jù)類型表示范圍的數(shù)值。數(shù) 值溢出不會引起編譯錯誤的,只要分母不為0就不會引起除 0進(jìn)行故障,但人使運(yùn)行結(jié)果發(fā)生偏差。 例如,在16位機(jī)器上進(jìn)行下面的操作: int weight = 42896 ; 在16位機(jī)器中將不能

7、得到值42896,而是-22640。因?yàn)?有符號整數(shù)的表示范圍是-3276832767。 3.3算術(shù)類型轉(zhuǎn)換 C+遇到兩種不同數(shù)據(jù)類型的數(shù)值進(jìn)行計(jì)算時(shí),會將兩 個(gè)數(shù)作適當(dāng)?shù)念愋娃D(zhuǎn)換,然后再進(jìn)行運(yùn)算。轉(zhuǎ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ù)類型都轉(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將會得到結(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)算過程中自動進(jìn)行的類型轉(zhuǎn)換稱為隱式類型轉(zhuǎn)換 。上例的表達(dá)式運(yùn)算過程中進(jìn)行的數(shù)據(jù)類型轉(zhuǎn)換就是隱式轉(zhuǎn) 換。 有時(shí)候,我們會面臨現(xiàn)面計(jì)算結(jié)果不正確的問題: long m = 234 * 456 / 6

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

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

11、號里的乘法,得到一個(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過的a值作為表 達(dá)式的值。而后增量操作a+的意義為:先將變量a的值作為 表達(dá)式的值確定下來,再將a增1。對于增量和減量操作符, 它要求操作數(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àn)閤=9 是賦值表達(dá)式,其表達(dá)式的值是所賦的值9,而9為非0值,所 以if語句的條件為真,所以

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

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

15、) cout=80 if(temp80) cout=優(yōu)先級低,所以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+中的處理方式,就可以在編寫程序時(shí),不 但避免不比較的錯誤,而且還可利用它。例如: if(b!=0 例中如果temp80的關(guān)系比較 ,直接執(zhí)行輸出語句。 3.6 if語句 1. If語句 if語句的語法為: if(條件表達(dá)式) 語句; 或: if(條

16、件表達(dá)式) 語句; 它的意義為:如果條件表達(dá)式進(jìn)行一次測試,且測試為真 ,則執(zhí)行后面的語句。 如果if語句只控制一條語句,則包圍該語句的花括號不是 必需的。 2.空語句 編譯器必須在if條件表達(dá)式的后面找到一個(gè)作為語句結(jié)束 符的分號“;”,以標(biāo)志if語句的結(jié)束。這樣,如果是下面的 代碼: if(條件表達(dá)式) ; 語句; 則不管條件表達(dá)式為真為假,總是接著執(zhí)行語句。 3. ifelse語句 語法為: if(條件表達(dá)式) /語句1; else /語句2; ifelse語句結(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語句成對的規(guī)則是:else連接到上面第 1個(gè)沒有配對的且為可見的if上。所以上例的else應(yīng)屬于第二個(gè) if語句,即第一種解釋。 又例如: if(條件) if(條件) if(條件) 語句; else 語句; 上例的else連到第2個(gè)if上,因?yàn)榈?個(gè)if不可見。第2個(gè)if 是else最先碰到的沒有配對過的if。 3.7 條件運(yùn)算符 條件運(yùn)算符的語法為: (條件表達(dá)式)?(條件

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

19、表達(dá)式的值與測試值沒有直接的關(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á)式的值 類型相同,均為左值,則該條件運(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 逗號表達(dá)式 逗號表達(dá)式的語法為: 表達(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賦值之后。該逗號表達(dá)式可以用下面3個(gè)有序的賦值語 句來表示: a=1; b=a+2; c=b+3; 逗號表達(dá)式是有值的,這一點(diǎn)是語句所不能代替的。逗 號表達(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的值。 逗號表達(dá)式還可以用于函數(shù)調(diào)用中的參數(shù)。例如: func(n,(j=1,j+4),k); 該函數(shù)調(diào)用有3個(gè)參數(shù),中間的參數(shù)是一個(gè)逗號表達(dá)式。 括號是必須的,否則,該函數(shù)有4個(gè)參數(shù)了。逗號表達(dá)式 作為值的形式,可以用于幾乎所有的地方。 C+中,如果逗號表達(dá)式的最后一個(gè)表達(dá)式為左值,則該 逗號表達(dá)式為左值。例如: (a=1,b,c+1,d)=5; /ok:即d=5 在C中,逗號表達(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。也就是說,交換律成立。 在C+中對簡單的表達(dá)式,交換律是成立,但對復(fù)合表達(dá)式, 交換律未必成立。例如: c=a*b+ +b; 與: c=+b+a*b; 在VC中,運(yùn)行結(jié)果前者為21,后者為24。 3. 求值順序使括號失去作用 在表達(dá)式中括號的優(yōu)先級使最高的。例如,a*(b+c)中, 先做加法,后做乘法。在C+中,簡單的表達(dá)式括號

溫馨提示

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

評論

0/150

提交評論