在順序結構中,各語句是按自上而下的順序執行的,執行完上一個語句就自動執行下一個語句,是無條件的,不必作任何判斷。實際上,很多情況下,需要根據某個條件是否滿足來決定是否執行指定的操作任務,或者從給定的兩種或多種操作選擇其一。 4.1選擇結構和條件判斷 例:定義一個函數,如果餓了吃飯。如果不餓不吃飯。 ...
在順序結構中,各語句是按自上而下的順序執行的,執行完上一個語句就自動執行下一個語句,是無條件的,不必作任何判斷。實際上,很多情況下,需要根據某個條件是否滿足來決定是否執行指定的操作任務,或者從給定的兩種或多種操作選擇其一。
4.1選擇結構和條件判斷
例:定義一個函數,如果餓了吃飯。如果不餓不吃飯。
1 #include <stdio.h> 2 int main() 3 { 4 int a; 5 printf("請輸入一個數 0或1 ,0代表不餓,1代表餓了\n"); 6 scanf("%d",%a); 7 if(a!=0||a!=1) 8 printf("輸入錯誤\n"); 9 if(a==1) 10 printf("餓了,吃飯。。。\n"); 11 else 12 printf("不餓,不吃飯。。。\n"); 13 return 0; 14 }View Code
1 若輸入0則,輸出“不餓,不吃飯。。。” 2 若輸入1則,輸出“餓了,吃飯。。。” 3 若輸出其他值,輸出”輸入錯誤“code result
C語言有兩種選擇語句:(1)if語句,用來實現兩個分支的選擇結構;(2)switch語句,用來實現多分支的選擇結構。
4.2 用if語句實現選擇結構
4.2.1 用if語句處理選擇結構舉例
例:實現兩個變數的交換
1 #include <stdio.h> 2 int main() 3 { 4 int a,b,temp; 5 printf("請輸入兩個數a b\n"); 6 scanf("%d%d",a,b); 7 printf("你輸入的值a=%d,b=%d\n",a,b); 8 printf("正在交換兩個數的位置\n"); 9 temp = a; 10 a = b; 11 b = temp; 12 printf("交換後的值a=%d,b=%d\n",a,b); 13 return 0; 14 }View Code
1 若輸入1,2;則輸出: 2 { 3 請輸入兩個數a b 4 你輸入的值a=1,b=2 5 正在交換兩個數的位置 6 交換後的值a=2,b=1 7 }Code Result
4.2.2 if語句的一般形式
if語句的一般形式如下:
if(表達式) 語句1
[else 語句2]
if語句中的“表達式”可以使關係表達式、邏輯表達式,甚至是數值表達式。
關係表達式就是兩個數值進行比較的式子。
根據if語句的一般形式,if語句可以寫成不同的形式,最常用的優以下3中形式:
(1)if(表達式)
語句1[複合語句] (沒有else子句部分)
(2)if(表達式) (有else子句部分)
語句1[複合語句]
else
語句2[複合語句]
(3)if(表達式1) 語句1[複合語句] (在else部分又嵌套了多層的if語句)
else if(表達式2) 語句2[複合語句]
else if(表達式3) 語句3[複合語句]
… …
else if(表達式m) 語句m[複合語句]
else 語句m+1[複合語句]
註意:複合語句應當用花括弧括起來。{} 花括弧括起來的多條語句稱為複合語句。
4.3 關係運算符和關係表達式
在C語言中,比較符(或稱比較運算符)稱為關係運算符。所謂“關係運算”就是“比較運算”,將兩個數值進行比較,判斷其比較的結果是否符合給定的條件。
4.3.1 關係運算符機器優先次序
C語言提供6中關係運算符:
①< (小於)
②<= (小於或等於)
③> (大於)
④>= (大於或等於)
⑤== (等於)
⑥!= (不等於)
①②③④優先順序相同(高),⑤⑥優先順序相同(低)
關於優先次序:
(1)前四種關係運算符(< <= > >=)的優先順序相同,後2種也相同。前4種高於後2種。
(2)關係運算符的優先順序低於算術運算符
(3)關係運算符的優先順序高於賦值運算符
4.3.2 關係表達式
用關係運算符將兩個數值或數值表達式連接起來的式子,稱關係表達式。關係表達式的值是一個邏輯值,即“真”或“假”。
在C的邏輯運算中,以“1”代表“真”,以“0”代表“假”。更準確來說,是“!0”代表真,“0”代表假。
4.4 邏輯運算符和邏輯表達式
4.4.1 邏輯運算符及其優先次序
有3中邏輯運算符:與(AND) 或(OR) 非(NOT)。註意:在C語言中不能在程式中直接用AND、OR、NOT作為邏輯運算符,而是用其他符號代替。C邏輯運算符及其含義如下:
“&&”和“||”是雙目(元)運算符,它要求有兩個運算對象(操作數);“!”是一目(元)運算符,只要求有一個運算對象。邏輯運算真值表:
按以下的優先次序:
(1)!(非)->&&(與)->||(或),即“!”為三者中最高的
(2)邏輯運算符中的“&&”和“||”低於關係運算符,“!”高於算術運算符。
4.4.2 邏輯表達式
邏輯表達式的值應該是一個邏輯量“真”或“假”。
實際上,邏輯運算符兩側的運算對象不但可以是0和1,或者是0和非0的整數,也可以是字元型、浮點型、枚舉型或指針型的純量型數據。(關於純量型的講解,在本人博客里C Language的第2章里有講解)系統最終以0和非0來判定他們屬於“真”或“假”。邏輯運算的真值表(用0和非0表示的另一種格式):
在邏輯表達式的求解中,並不是所有的邏輯運算符都被執行,只是在必須執行下一個邏輯運算符才能求出表達式的解時,才執行該運算符;如
(1)a&&b&&c。只有a為真(非0)時,才需要判別b的值。只有當a和b都為真的情況下才需要判別c的值。如果a為假,就不必判斷b和c的值(此時整個表達式已確定為假)。換個說法,就是a若為假,則b和c被短路了,不會被執行。
(2)a||b||c。只要a為真(非0)是,就不必判斷b和c。只有a為假,才判別b。a和b都為假才判別c。
4.4.3 邏輯型變數
這是C99有所增加的一種數據類型。可將關係運算和邏輯運算的結果存到一個邏輯變數中,以便於分析和運算。定義邏輯變數用類型符_Bool.
float score;
scanf(“%f”,&score);
_Bool a ,b; //a和b被定義為邏輯型變數
a = score>=60; //將關係表達式score>=60的值賦給邏輯變數a
b = score<=69; //將關係表達式score<=60的值賦給邏輯變數b
if(a&&b) //如果a和b均為真,輸出分數等級為C
printf(“The grade is C\n”);
如果在源文件中用#include指令包含了頭文件stdbool.h,那麼上面的程式段可以寫成:
float score;
scanf(“%f”,&score);
bool a ,b; //a和b被定義為邏輯型變數
a = score>=60; //將關係表達式score>=60的值賦給邏輯變數a
b = score<=69; //將關係表達式score<=60的值賦給邏輯變數b
if(a&&b) //如果a和b均為真,輸出分數等級為C
printf(“The grade is C\n”);
註意:在使用bool類型時,要先瞭解自己所用的編譯系統能否允許使用邏輯型變數bool和true和false.
4.5 條件運算符和條件表達式
有一種if語句,當被判別的表達式的值為“真”或“假”時,都執行一個賦值語句且向同一個變數賦值,如:
if(a>b)
max = a;
else
max = b;
以上的if語句可以改寫為:
max = (a>b)?a:b;
條件運算符有兩個符號(?和:)組成,必須一起使用,要求有3個操作對象,稱為三目(元)雲三幅,它是C語言中唯一的一個三目運算符。
條件表達式的一般形式為:
表達式1?表達式2:表達式3
執行過程:先計算出表達式1的值,若為非零(真),則執行表達式2;否則,執行表達式3.
說明:
(1)條件運算符的執行順序:先求解表達式1,若為非0(真)則求解表達式2,表達式2的值就作為整個條件表達式的值。若表達式1的值為0(假)則求解表達式3,表達式3的值就作為整個條件表達式的值。
(2)條件運算符優先於賦值運算符,因此複製表達式的求解過程是先求解條件表達式再將它的值賦給max
條件運算符的優先順序別比關係運算符和算術運算符都低。
例:輸入一個字元,判別它是否為大寫字母,若是,則轉換為小寫字母。
#include <stdio.h>
int main()
{
char ch;
scanf(“%c”,&ch);
ch = (ch>=’A’&&ch<=’Z’)?(ch+32):ch;
printf(“%c\n”,ch);
return 0;
}
運行結果 A 回車 a
4.7選擇結構的嵌套
在if語句中又包含一個或多個if語句稱為if語句的嵌套(nest)。其一般形式如下:
if()
if() 語句1
else() 語句2
else
if() 語句3
else() 語句4
應當註意,if與else的配對關係。else總是與它上面的最近的未配對的if配對。如:
if()
if() 語句1
else
if() 語句2
else 語句3
有些編程者會把else寫在與第1個if(外層if)同一列上,意圖是使else與第1個if對應,但實際上else是與第2個if配對,因為它們相距最近。
為了避免二義性的混淆,最好使內嵌if語句也包含else部分。如:
if()
{
if() 語句1
}
else 語句2
這時“{}”限定了內嵌if語句的範圍,因此else與第一個if配對。
4.7用switch語句實現多分支選擇結構
C語言提供switch語句直接處理多分支選擇。
switch語句是多分支選擇語句。
switch漁具店作用是根據表達式的值,是流程跳轉到不同的語句。switch語句的一般形式如下:
switch(表達式)
{
case 常量1 : 語句1
case 常量1 : 語句1
… …
case 常量n : 語句n
default : 語句n+1
}
說明:
(1)switch後面的括弧內的“表達式”,其值的類型應為整數類型(包括字元型)
(2)switch下麵的花括弧內是一個複合語句。這個複合語句包括若幹語句,它是switch語句的語句體。語句體內包含多個以關鍵字case開頭的語句行和最多一個以default開頭的行。
case後面跟一個常量(或常量表達式),如:case ‘A’ ,它們和default都是標號(label或稱標簽、標記)的作用,用來標誌一個位置。執行switch語句時,先計算switch後面的“表達式”的值,然後將它與各case標號比較,如果與某一個case標號中的常量相同,流程就轉到此case標號後面的語句。如果沒有與switch表達式相匹配的case常量,流程轉去執行default標號後面的語句。換句話說,就是表達式和case後面的常量比較,有適配的就執行對應的語句;如果case沒有匹配的常量,就執行default後面的語句。
(3)可以沒有default標號,此時如果沒有與switch表達式相匹配的case常量,則不執行任何語句,流程轉到switch語句的下一個語句。
(4)各個case標號出現次序不影響執行結果。如,可以先出現default標號,然後再出現case標號。
(5)每一個case常量必須互不相同;否則就會出現相互矛盾的現象(對switch表達式的同一個值,有兩種或多種執行方案)
(6)case標號只起標記的作用。如果在個case子句中沒有break語句,則會連續輸出剩下從case標號對應的語句,直至遇到break或者結束switch選擇分支。
註意:一般情況下,在執行一個case子句後,應當用break語句使流程跳出switch結構,即終止switch語句的執行。最後一個case子句(或者default子句)中可不必加break語句,因為流程已到了switch結構的結束處。
(7)在case子句中雖然包括了一個以上執行執行語句,但可以不必用花括弧括起來,會自動順序執行本case標號後面所有的語句。當然也可以加上花括弧。
(8)多個case標號可以共用一組執行語句。
例:case ‘A’
case ‘B’
case ‘C’ : printf(“>60\n”);break;
當值為’A’ ’B’ ’C’時,都會執行同一組語句,輸出“>60”,然後換行。
例:
1 #include <stdio.h> 2 3 int main() 4 5 { 6 7 char ch; 8 9 ch = getchar(); 10 11 switch(ch) 12 13 { 14 15 case 'a': 16 17 case 'b': 18 19 case 'c': { 20 21 printf("a"); 22 23 printf("b"); 24 25 printf("c"); 26 27 } 28 29 } 30 return 0; 31 32 }View Code
運行結果:輸入a 輸出結果為abc;