C語言之邏輯運(yùn)算-文檔資料_第1頁
C語言之邏輯運(yùn)算-文檔資料_第2頁
C語言之邏輯運(yùn)算-文檔資料_第3頁
C語言之邏輯運(yùn)算-文檔資料_第4頁
C語言之邏輯運(yùn)算-文檔資料_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、1第四章第四章 邏輯運(yùn)算和判斷選取控制邏輯運(yùn)算和判斷選取控制 41 關(guān)系運(yùn)算符和關(guān)系表達(dá)式關(guān)系運(yùn)算符和關(guān)系表達(dá)式 關(guān)系運(yùn)算關(guān)系運(yùn)算是邏輯運(yùn)算中比較簡單的一種。所謂“關(guān)系關(guān)系運(yùn)算運(yùn)算”實(shí)際上是“比較運(yùn)算比較運(yùn)算”。將兩個(gè)值進(jìn)行比較,判斷比較的結(jié)果是否符合給定的條件。例如,a a3 3是一個(gè)關(guān)系表達(dá)式,大于號()是一個(gè)關(guān)系運(yùn)算符,如果a的值為5,則滿足給定的“a3”條件,因此關(guān)系表達(dá)式的值為“真”(即“條件滿足”);如果a的值為2,不滿足“a3”條件,則稱關(guān)系表達(dá)式的值為“假”。2 4.1.1 關(guān)系運(yùn)算符及其優(yōu)先次序關(guān)系運(yùn)算符及其優(yōu)先次序 C語言提供6種關(guān)系運(yùn)算符: (1) (小于) (2) (大

2、于) (4) = (大于或等于) (5) = = (等于) (6) != (不等于)關(guān)于優(yōu)先次序:1前4種關(guān)系運(yùn)算符(,)的優(yōu)先級別相同,后兩種也相同。前4種高于后2種。例如,“”優(yōu)先于“=”。而“”與“”優(yōu)先級相同。 2關(guān)系運(yùn)算符的優(yōu)先級低于算術(shù)運(yùn)算符。 3. 關(guān)系運(yùn)算符的優(yōu)先級高于賦值運(yùn)算符。 高 低 算術(shù)運(yùn)算符 關(guān)系運(yùn)算符 賦值運(yùn)算符例如:ca+b 等效于 c(a+b) ab!=c 等效于 (ab)!=c a=bc 等效于 a=(bb, abbc,(a3)(b=5),ab,(ab)(bc)關(guān)系表達(dá)式的值是一個(gè)邏輯值,即“真”或“假”。例如,關(guān)系表達(dá)式“53”的值為“假”“5=0”的值為“

3、真”。C語言沒有邏輯型數(shù)據(jù)(Pascal語言以True表示“真”,以Fa1se表示“假”。PASCAL和FORTRAN等語言都有邏輯型變量和邏輯型常量),以1代表“真”,以“0”代表“假”。例如,若a=3,b=2,c=1,則: ab的值為”真”,表達(dá)式的值為1。(ab)=c的值為“真”(因?yàn)閍b的值為1,等于c的值),表達(dá)式的值為1。 bca的值為“假”,表達(dá)式的值為0。 如果有以下賦值表達(dá)式: dab d的值為1。 fabc f的值為0(因?yàn)椤啊边\(yùn)算符是自左至右的結(jié)合方向,先執(zhí)行“ab”,得值為1,再執(zhí)行關(guān)系運(yùn)算:“1c”得值0,賦給f4 42邏輯運(yùn)算符和邏輯表達(dá)式邏輯運(yùn)算符和邏輯表達(dá)式用邏

4、輯運(yùn)算符將關(guān)系表達(dá)式或邏輯量連接起來就是邏輯表達(dá)式。下面介紹C語言中的邏輯運(yùn)算符和邏輯運(yùn)算。 4.2.1邏輯運(yùn)算符及其優(yōu)先次序邏輯運(yùn)算符及其優(yōu)先次序 C語言提供三種邏輯運(yùn)算符: 1& 邏輯與(相當(dāng)于其它語言中的AND) 2| 邏輯或(相當(dāng)于其它語言中的OR) 3 ! 邏輯非(相當(dāng)于其它語言中的NOT) &和|”是“雙目(元)運(yùn)算符”,它要求有兩個(gè)運(yùn)算量(操作數(shù)),如(ab)&(xy),(ab)|(xy)。“!”是“一目(元)運(yùn)算符”,只要求有一個(gè)運(yùn)算量,如?。╝b)。 邏輯運(yùn)算舉例如下: a&b 若a,b為真,則a&b為真。 a|b 若a,b之一為真,則

5、a|b為真。 !a 若a為真,則!a為假。5 下表為邏輯運(yùn)算的“真值表”。用它表示當(dāng)a和b的值為不同組合時(shí),各種邏輯運(yùn)算所得到的值。 a b !a !b a&b a|b T T F F T T T F F T F F 在一個(gè)邏輯表達(dá)式中如果包含多個(gè)邏輯運(yùn)算符,如 !a&b|xy&c 優(yōu)先次序:優(yōu)先次序: 高高 低低 !算術(shù)運(yùn)算符算術(shù)運(yùn)算符關(guān)系運(yùn)算符關(guān)系運(yùn)算符& |& |賦值運(yùn)算符賦值運(yùn)算符!a&b|xy&c ((!a)&b)|(xy)&c) (ab)&(xy) 可寫成:ab&xy(a=b)|(x=y) 可寫

6、成:a=b|xy (!a) |(ab) 可寫成: !a|ab6 4.2.2邏輯表達(dá)式邏輯表達(dá)式 如前所述,邏輯表達(dá)式的值應(yīng)該是一個(gè)邏輯量“真”或“假”。C語言編譯系統(tǒng)在給出邏輯運(yùn)算結(jié)果時(shí),以數(shù)值1代表“真”,以0代表“假”,但在判斷一個(gè)量是否為“真”時(shí),以以0 0代表代表“假假”,以非,以非0 0代表代表“真真”。即將一個(gè)非零的數(shù)值認(rèn)作為“真”。例如: 若a4,則!a的值為0。因?yàn)閍的值為非0,被認(rèn)作“真”,對它進(jìn)行“非”運(yùn)算,得“假”,“假”以0代表。 若a=4,b=5,則a&b的值為1。因?yàn)閍和b均為非0,被認(rèn)為是“真”,因此a&b的值也為“真”,值為1。 a、b值同前,a

7、|b的值為1。 a、b值同前,!a|b的值為1。 4&0|2的值為1。 通過這幾個(gè)例子可以看出,由系統(tǒng)給出的邏輯運(yùn)算結(jié)果不是0就是1,不可能是其它數(shù)值。而在邏輯表達(dá)式中作為參加邏輯運(yùn)算的運(yùn)算對象(操作數(shù))可以是0(“假”)或任何非0的數(shù)值(按“真”對待)。如果在一個(gè)表達(dá)式中不同位置上出現(xiàn)數(shù)值,應(yīng)區(qū)分哪些是作為數(shù)值運(yùn)算或關(guān)系運(yùn)算的對象,哪些作為邏輯運(yùn)算的對象,7例如 53&2|84-!0表達(dá)式自左至右掃描求解。首先處理“53”(因?yàn)殛P(guān)系運(yùn)算符優(yōu)先于&)。在關(guān)系運(yùn)算符兩側(cè)的5和3作為數(shù)值參加關(guān)系運(yùn)算,”53”的值為:1。再進(jìn)行”1&2”的運(yùn)算,此時(shí)1和2均是邏輯運(yùn)算

8、對象,均作“真”處理,因此結(jié)果為1。再往下進(jìn)行“1|84-!0”的運(yùn)算。根據(jù)優(yōu)先次序,先進(jìn)行“!0”運(yùn)算得1,因此,要運(yùn)算的表達(dá)式變成:“1|84-1”,即“1|8d不被執(zhí)行,因此n的值不是0而仍保持原值1。這點(diǎn)請讀者注意。 熟練掌握C語言的關(guān)系運(yùn)算符和邏輯運(yùn)算符后,可以巧妙地用一個(gè)邏輯表達(dá)式來表示 一個(gè)復(fù)雜的條件。 例如,判別某一年year是否閏年。閏年的條件是符合下面二者之一:能被4整除,但 不能被100整除。能被4整除,又能彼400整除。 可以用一個(gè)邏輯表達(dá)式來表示: year40&(year100 !=0|year400=0) 當(dāng)year為某一整數(shù)值時(shí),上述表達(dá)式值為真(1),

9、則year為閏年;否則為非閏年。 可以加一個(gè)“!”用來判別非閏年: !( year40&year100 !=0|year400=0) 若表達(dá)式值為真(1), year為非閏年。也可以用下面邏輯表達(dá)式判別非閏年:(year4!=0)|(year100=0|year400!=0) 表達(dá)式為真,year為非閏年。請注意表達(dá)式中右面的括弧內(nèi)的不同運(yùn)算符(,!,&、=)的運(yùn)算優(yōu)先次序。943 if語句語句 if語句是用來判定所給定的條件是否滿足,根據(jù)判定的結(jié)果(真或假)決定執(zhí)行給出的兩種操作之一。 4.3.1 if語句的三種形式語句的三種形式 C語言提供了三種形式的if語句: 1if i

10、f (表達(dá)式)(表達(dá)式) 語句語句 例如:if(xy) printf(”d”,x); 這種if語句的執(zhí)行過程見圖0表達(dá)式語句110 2ifif(表達(dá)式)(表達(dá)式) 語句語句1 else 1 else 語句語句2 2 例如:if(xy) printf(”d”,x); else printf(”d”,y); 見圖表達(dá)式表達(dá)式語句語句1語句語句2真假113 if if (表達(dá)式(表達(dá)式1 1) 語句語句1 1 else if else if (表達(dá)式(表達(dá)式2 2) 語句語句2 2 else if else if(表達(dá)式(表達(dá)式3 3) 語句語句3 3 else if else if (表達(dá)式(表達(dá)

11、式m m) 語句語句m m else else 語句語句n n 流程圖表達(dá)式表達(dá)式1FT表達(dá)式表達(dá)式3FT表達(dá)式表達(dá)式2FT表達(dá)式表達(dá)式4FT語句語句4語句語句5語句語句3語句語句2語句語句112 例如。 if (number500) cost015; else if(number300) cost=010: else if (number100) cost=0075; else if (number50) cost0.05; else cost0; 說明:三種形式的if語句中在if后面都有“表達(dá)式”,一般為邏輯表達(dá)式或關(guān)系表達(dá)式。例如,if(a=b&.x=y) printf(”a=b

12、,x=y”);系統(tǒng)對表達(dá)式的值進(jìn)行判斷,若為若為0 0,按,按“假假”處理,若為非處理,若為非0 0,按,按“真真”處理,處理,執(zhí)行指定的語句。假如有以下語句:if(3) printf(“ok.”);是合法的,執(zhí)行結(jié)果輸出”ok”。因?yàn)楸磉_(dá)式的值為3,按“真”處理。由此可見,表達(dá)式的類型不限于邏輯表達(dá)式,可以是任意的數(shù)值類型(包括整型、實(shí)型、字符型、指針型數(shù)據(jù))。例如,下面的語句也是合法的: if(a) printf(”d”,a);執(zhí)行結(jié)果:輸出a的AscII碼97。13 2第二、第三種形式的討語句中,在每個(gè)else前面有一分號,整個(gè)語句結(jié)束處有一分號。例如: if (x0) printf(“

13、%f”,x); else printf(“%f”,-x); 這是由于分號是C語句中不可缺少的部分,這個(gè)分號是讓語句中的內(nèi)臥語句所要求的。如果無此分號,則出現(xiàn)語法錯(cuò)誤。但應(yīng)注意,不要誤認(rèn)為上面是兩個(gè)語句(if語句和else語句)。 它們都屬于同一個(gè)if語句。else子句不能作為語句單獨(dú)使用,它必須是if語句的一部分,與if配對使用。 3在if和else后面可以只含一個(gè)內(nèi)嵌的操作語句(如上例),也可以有多個(gè)操作語句,此時(shí)用花括號“ ”將幾個(gè)語句括起來成為一個(gè)復(fù)合語句。如: if (abc&bca&cab) s=05*(ab+c);area=sqrt(s*(s-a)*(s-b)*(s

14、-c)); printf(”area6.2f”,area); else printf (”it is not a trilateral”); 注意在 外面不需要再加分號。因?yàn)?內(nèi)是一個(gè)完整的復(fù)合語句,不需另附加分號。14 例4。1輸入兩個(gè)實(shí)數(shù),按代數(shù)值由小到大次序輸出這兩個(gè)數(shù)。 /* example 4.1 at page 53 */main()float a,b,t;scanf(%f,%f,&a,&b);if(ab) t=a;a=b;b=t;printf(%5.2f,%5.2f,a,b); 運(yùn)行情況如下。 3.6,-3.2一32036015例42輸入三個(gè)數(shù),按大小順序輸出。m

15、ain()float a,b,c,t; printf(Input a,b,cn);scanf(%f,%f,%f,&a,&b,&c);if(ab) t=a;a=b;b=t;if(ac) t=a;a=c;c=t;if(bc) t=b;b=c;c=t;printf(%5.2f,%5.2f,%5.2f,a,b,c); 運(yùn)行情況如下: 3,7,1 1O0,300,70016 4.3.2語句的嵌套語句的嵌套 在if語句中又包含一個(gè)或多個(gè)if語句稱為if語句的嵌套。一般形式如下: if () if()語句1 else 語句2 else if ()語句3 else 語句4 應(yīng)當(dāng)注意應(yīng)當(dāng)

16、注意ifif與與elseelse的配對關(guān)系。從最內(nèi)層開始,的配對關(guān)系。從最內(nèi)層開始,elseelse總是與它上總是與它上面最近的(未曾配對的)面最近的(未曾配對的)ifif配對配對。假如寫成: 1f () if()語句1 else if ()語句2 else 語句3編程序者把else寫在與第一個(gè)if(外層if)同一列上,希望else與第一個(gè)if對應(yīng),但實(shí)際上else是與第二個(gè)if配對,因?yàn)樗鼈兿嗑嘧罱?。因此最好使?nèi)嵌if語句也包含else部分,這樣if的數(shù)目和else的數(shù)目相同,從內(nèi)層到外層一一對應(yīng),不致出措。17如果if與else的數(shù)目不一樣,為實(shí)現(xiàn)程序設(shè)計(jì)者的企圖,可以加花括弧來確定配對關(guān)

17、系。例如: if( ) if ( )語句1 else 語句2這時(shí)if限定了內(nèi)嵌if語句的范圍,因此else與第一個(gè)讓配對。 例43有一函數(shù): -1 (x0)編一程序,輸入一個(gè)x值,輸出y值。 有以下幾種寫法,請讀者判斷哪些是正確的?18程序1: main () int x,y; scanf(”d”,x); if(x=0) if(x0) y=1; else y=0; else y一1; 19程序3: 將上述if語句改為: y一1; if(x!=0) if(x0) y1: else y0; 程序4: y0; if(x=0) if(x0) y1; else y-1; 只有程序1和2是正確的。一般把內(nèi)

18、嵌的if語句放在外層的else子句中(如程序1那樣),這樣由于有外層的else相隔,內(nèi)嵌的else不會和外層的if配對,而只能與內(nèi)嵌的讓配對,從而不致搞混,如像程序3、4那樣就容易混淆。20 4.3.3條件運(yùn)算符條件運(yùn)算符 若if語句中,在表達(dá)式為“真”和“假”時(shí),且都只執(zhí)行一個(gè)賦值語句給同一個(gè)變量賦值時(shí),可以用簡單的條件運(yùn)算符來處理。例如,若有以下if語句: if (ab) max=a; else maxb;可以用下面的條件運(yùn)算符條件運(yùn)算符(? :? :)來處理: max(ab)?a:b;其中”(ab)?a:b”是一個(gè)“條件表達(dá)式條件表達(dá)式”。它是這樣執(zhí)行的。如果(ab)條件為真,則條件表式

19、取值a,否則取值b. 條件運(yùn)算符要求有三個(gè)操作對象三個(gè)操作對象, ,稱三目稱三目( (元元) )運(yùn)算符。運(yùn)算符。條件表達(dá)式的一般形式為 表達(dá)式表達(dá)式1 1?表達(dá)式?表達(dá)式2 2:表達(dá)式:表達(dá)式3 3 它的執(zhí)行過程見圖47。表達(dá)式1表達(dá)式2表達(dá)式3T (1)F(0)21說明 1條件運(yùn)算符的執(zhí)行順序:先求解表達(dá)式1,若為非0(真)則求解表達(dá)式2,此時(shí)表達(dá)式2的值就作為整個(gè)條件表達(dá)式的值。若表達(dá)式1的值為0(假),則求解表達(dá)式3,表達(dá)式3的值就是整個(gè)條件表達(dá)式的值。 max(ab)?a:b執(zhí)行結(jié)果就是將條件表達(dá)式的值賦給max,也就是將a和b二者中大者賦給max。 2條件運(yùn)算符優(yōu)先于賦值運(yùn)算符,因此

20、上面賦值表達(dá)式的求解過程是先求解條件表達(dá)式,再將它的值賦給max。 條件運(yùn)算符的優(yōu)先級別比關(guān)系運(yùn)算符和算術(shù)運(yùn)算符都低。因此, max=(ab)?a:b括號可以不要,可寫成 max=ab?a:b如果有 ab?a:b+1相當(dāng)于ab?a:(b十1),而不相當(dāng)于(ab?a:b)1。223。條件運(yùn)算符的結(jié)合方向?yàn)椤白杂抑磷蟆?。如果有以下條件表達(dá)式: ab?a:cd?c:d相當(dāng)于 ab?a:(cd?c:d)a=1,b=2,c=3,d4,則條件表達(dá)式的值等于4。 4條件表達(dá)式不能取代一般的if語句,只有在if語句中內(nèi)嵌的語句為賦值語句(且兩個(gè)分支都給同一個(gè)變量賦值)時(shí)才能代替if語句。象下面的if語句就無法

21、用一個(gè)條件表達(dá)式代替。 if(ab) printf(“d”,a); else printf(“d”,b);但可以用下面語句代替: printf(”d”,ab?a:b);即將條件表達(dá)式的值輸出。 5條件表達(dá)式中,表達(dá)式1的類型可以與表達(dá)式2和表達(dá)式3的類型不同。如 x?a:bx是整型變量,若x=0,則條件表達(dá)式的值為b。表達(dá)式2和表達(dá)式3的類型也可以不同,此時(shí)條件表達(dá)式的值的類型為二者中較高的類型。如 xy?1:1.5如xy值應(yīng)為1,由于15是實(shí)型,比整型高(見第二章27),因此,將1轉(zhuǎn)換成實(shí)型值10。23例44輸入一個(gè)字符,判別它是否大寫字母,如果是,將它轉(zhuǎn)換成小寫字母;如果不是,不轉(zhuǎn)換。然后

22、輸出最后得到的字符。 /* example 4.4 at page 57 */main()char ch;scanf(%c,&ch);ch=(ch=A & ch=Z)?(ch+32):ch;printf(%c,ch); 運(yùn)行結(jié)果如下: 條件表達(dá)式中的(ch32),其中32是小寫字母和大寫字母ASCII碼的差值(請參閱附錄1)。24 44 switch語句語句 switch語句是多分支選擇多分支選擇語句。if語句只有兩個(gè)分支可供選擇,而實(shí)際問題中常常需要用到多分支的選擇。例如,學(xué)生成績分類(90分以為A等,8089分為B等,7079分為c,等,);人口統(tǒng)計(jì)分類(按年齡分為老、中、

23、青、少、兒童);工資統(tǒng)計(jì)分類;銀行存款分類;等。當(dāng)然這些都可以用嵌套的讓語句來處理,但如果分支較多,則嵌套的if語句層數(shù)多,程序冗長而且可讀性降低。C語言提供switch語句直接處理多分支選擇,它相當(dāng)于Pascal語言中的case語句。它的一般形式如下: switch (表達(dá)式) case常量表達(dá)式1:語句1 case常量表達(dá)式2:語句2 case常量表達(dá)式n:語句n default :語句n十1 25例如,根據(jù)考試成績的等級打印出百分制分?jǐn)?shù)段: switch (grade) caseA: printf (“85100n”); caseB: printf(“7084n”); caseC: pr

24、intf (“6069n”); case D: printf(“60n”); default : printf (”errorn”); 26 說明: 1switch后面括弧內(nèi)的“表達(dá)式”,可以是整型表達(dá)式或字符型表達(dá)式,也可以是枚舉型數(shù)據(jù)(見第十章)。對其它類型,原來的C標(biāo)準(zhǔn)是不允許的,而新的ANSI標(biāo)準(zhǔn)允許上述表達(dá)式和case常量表達(dá)式為任何類型。 2當(dāng)表達(dá)式的值與某一個(gè)case后面的常量表達(dá)式的值相等時(shí),就執(zhí)行此case后面的語句,若所有的case中的常量表達(dá)式的值都沒有與表達(dá)式的值匹配的,就執(zhí)行defau1t后面的語句。3。每一個(gè)case的常量表達(dá)式的值必須互不相同,否則就會出現(xiàn)互相矛盾

25、的現(xiàn)象(對表達(dá)式的同一個(gè)值,有兩種或多種執(zhí)行方案)。 4各個(gè)case的出現(xiàn)次序不影響執(zhí)行結(jié)果。例如,可以先出現(xiàn)caseD:,然后是caseA: 5。執(zhí)行完一個(gè)case后面的語句后,流程控制轉(zhuǎn)移到下一個(gè)case繼續(xù)執(zhí)行。“case常量表達(dá)式常量表達(dá)式”只是起語句標(biāo)號作用只是起語句標(biāo)號作用,并不是在該處進(jìn)行條件判斷。在執(zhí)行switch語句時(shí),根據(jù)switch后面表達(dá)式的值找到匹配的人口標(biāo)號,就從此標(biāo)號開始執(zhí)行下去,不再進(jìn)行判斷。27例如,上面的例子中,若grade的值等于A,則將連續(xù)輸出: 85100 7084 6069 60 error因此,應(yīng)該在執(zhí)行一個(gè)case分支后,使流程跳出switch結(jié)構(gòu),即終止switch語句的執(zhí)行,可以用了個(gè)break語句來達(dá)到此目的,將上面的switch結(jié)構(gòu)改寫如下: switch (grade) caseA:printf(“85100n”); break; caseB:printf(“7084n”); break; caseC:printf(“16069n”);break; caseD:printf(“60n”); break; default printf(“errorn“); A B C D 其它85100708460690,有兩個(gè)不等實(shí)根。 b2一

溫馨提示

  • 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

提交評論