前面的代碼都是按照順序結構進行設計。在開發系統的時候有時候需要實現:當年齡大於 18 歲的時候,執行 A,否則執行 B。就要用選擇結構。
C 語言為實現選擇結構提供了 2 種語句:
(1) if 選擇語句。
(2) switch 選擇語句。
(一) if 語句
if 語句是通過判斷給定的條件是否為真,來決定是否執行指定的代碼,if 語句常用的形式有 3 種。
1. if 語句的第一種形式
if(表達式) 語句
或
if(表達式)
{
語句塊
}
(1) 表達式一般是比較表達式、或邏輯表達式。
(2) 語句可以是單行語句,也可以是復合語句(語句塊)。
如果表達式運算結果為真(非 0 為真),則執行 if 后面的語句,如果為假(0 為假)直接跳過
該語句(語句塊)。
//if 語句應用
#include<stdio.h>
int main()
{
int age=8;
if(age>18)
{
printf("年齡大於 18\n");
}
printf("執行結束\n");
getchar();
return 0;
}
當 if 語句后面指定的語句只有一行時,花括號{ }可以省略不寫,例如:
#include<stdio.h>
int main()
{
int age=8;
if(age>18)
printf("年齡大於 18\n");
printf("執行結束\n");
getchar();
return 0;
}
不過為了使程序更加清晰、避免出錯,建議讀者無論 if 語句后面指定的語句有多少行,都加上花括號{ }。
2. if 語句的第二種形式
if(表達式)
{
語句 1
}//這里不要寫分號,因為不是一個獨立的代碼結構
else
{
語句 2
}
該語句的執行過程為:如果表達式結果為真(非 0),執行 if 后面{ }中的語句 1。如果為假(0),則執行 else 后面{ }中的語句 2。也就是說 if 與 else 后面的語句只能有一個被執行。
#include<stdio.h>
int main()
{
int age=10;
if(age>18)
{
printf("成年人\n");
}
else
{
printf("未成年人");
}
getchar();
return 0;
}
3. if 語句的第三種形式
if(表達式 1)
{
語句 1;
}
else if(表達式 2)
{
語句 2;
}
……
else if(表達式 m)
{
語句 m;
}
else
{
語句 n;
}
這種形式的 if 語句也被稱為 if…else if…esle 語句,該語句的執行過程為:依次判斷表達式的值,當其中一個表達式結果為真(非 0),執行其后面對應的語句,然后直接跳出整個 if語句。如果所有的表達式都是假,則執行 else 后面的語句,然后跳出整個 if 語句。
#include<stdio.h>
int main(void)
{
int age=16;
if(age<0)
{
printf("年齡不正確\n");
}
else if(age<6)
{
printf("%s\n","小嬰兒");
}
else if(age<18)
{
printf("%s\n","小鮮肉");
}
else if(age<50)
{
printf("%s\n","大叔");
}
else
{
printf("%s\n","老爺爺");
}
getchar();
return 0;
}
else 也可以省略,那么就是如果上面的每個 if 都不匹配,就什么都不做。
(二) if 語句常見錯誤
1. 常見錯誤 1
//if 語句后面多加了分號,出錯代碼:
#include<stdio.h>
int main()
{
int age=10;
if(age>18); //錯誤寫法
{
printf("年齡大於 18\n");
}
printf("執行結束");
getchar();
return 0;
}
第 5 行 if 后面多加了分號。前面講過 C 語言中單獨的分號也是一條語句,叫做空語句。因此,系統會將左側第 5 行當做一個完整的 if 語句看待,當條件為真時執行后面的空語句。而第 6-8 行,則當做普通的語句塊,所以無論 if 條件是真、是假,該語句塊都會被執行。
2. 常見錯誤 2
在 if 語句中,將比較運算(==)錯誤寫成了賦值運算符(=),例如:
#include<stdio.h>
int main()
{
int a=0;
if(a=0) //出錯代碼
{
printf("a 等於 0\n");
}
else
{
printf("a 不等於 0\n");
}
getchar();
return 0;
}
這樣 a=0 就是賦值表達式,值就是賦值之后的值 0,也就是 if(a=0)永遠是“假”。
為了避免失誤寫錯,有人習慣這樣寫相等判斷:
if(0==a)
這樣萬一寫錯成了 if(0=a)那么就會有編譯錯誤導致編譯失敗,就能提前發現問題了。
(三) if 語句嵌套
if 語句嵌套指的是在 if 語句中再嵌套使用 if 語句。以第一種形式 if 語句為例:
if(表達式 1)
{
if(表達式 2) //if 語句嵌套
{
語句;
}
}
下面通過例子來理解 if 語句嵌套使用。
#include<stdio.h>
int main()
{
int age=35;
if(age>18) //外層 if 語句
{
printf("age 大於 18");
if(age>30) //內層 if 語句
{
printf("age 大於 30");
}
}
getchar();
return 0;
}
看起來很復雜,其實只要知道“每一級嵌套都是一個小世界”,在看外層嵌套的時候,把內層的嵌套看成一個語句就行了,分析內部嵌套的時候再忽略外部的嵌套。
(五) switch 語句
C 語言提供了另外一種多分支處理語句:switch 語句。
1. switch 語句形式
switch 語句的一般形式:
switch(表達式)
{
case 字面量表達式 1: 語句 1;
break;
case 字面量表達式 2: 語句 2;
break;
……
case 字面量表達式 n: 語句 n;
break;
default: 語句 n+1;
}
【說明】
- switch 小括號中表達式的運算結果必須是整數類型(包括字符類型),比如:long、int、short、char 等等。不能是 float 等其他類型。
- case 后面的字面量表達式運算結果也必須是整數類型。
- switch 下面的花括號內是一個語句塊。語句塊中包含多個以 case 開頭、break 結尾的行、最多一個以 default 開頭的行出現在語句塊的結束部分,並且只能出現一次。
- 當表達式的值與 case 后面的值相等時,就執行該 case 后面的語句,接着執行下一行的break,然后退出整個switch語句,switch中其他語句都不再執行,這一點和if…else if…else語句有點類似。
- 如果表達式的值與所有 case 后面的值都不匹配時,則執行 default 后面的語句,然后退出 switch。
- switch 中的“case 字面量”只是一個標記,一旦 switch 表達式的值與其中一個 case后面字面量匹配時,就會從該 case 行一直執行下去,直到遇到 break 才停止,然后退出 switch語句塊。因此寫 case 的時候結尾不要忘了寫 break。
switch 中只要有一個 break 語句被執行,就會直接結束整個 switch 語句塊。