本節目總導演:rampant boy
本節目總編劇:rampant boy
本節目總策劃:rampant boy
本集將重點介紹分支陳述句和回圈陳述句,下面進入正文:
文章目錄
- 什么是陳述句?
- 分支陳述句(選擇結構)
- if陳述句
- 懸空else
- switch陳述句
- switch陳述句的使用
- switch陳述句中的break
- default子句
- 回圈陳述句
- while回圈
- while回圈的使用
- while回圈中的break
- while回圈中的continue
- for回圈
- for回圈的使用
- for回圈中的break
- for回圈中的continue
- for回圈的變種
- 變種一
- 變種二
- do...while()回圈
- do...while回圈的使用
- do...while()回圈中的continue和break
- goto陳述句
什么是陳述句?
C語言中有一個;(分號)隔開的就是一條陳述句,
例如:
printf("haha");
3 + 5;
;//空陳述句
上面所列舉的三個例子就是三條陳述句,
分支陳述句(選擇結構)
if陳述句
if陳述句的語法結構為:
if(運算式)
陳述句;
如果運算式為真,則執行陳述句,
在C語言中,非0就是真,0就是假,
一般地,if與else連用,比如:
if(運算式)
陳述句1;
else
陳述句2;
如果運算式為真,則執行陳述句1,否則,執行陳述句2,
多分支的情況下:
if(運算式1)
陳述句1;
else if(運算式2)
陳述句2;
else
陳述句3;
如果運算式1為真,則執行陳述句1;如果運算式1為假,但運算式2為真,則執行陳述句2,如果運算式1和運算式2均為假,則執行陳述句3,
我們可以舉一些具體的例子:
int main()
{
int age = 20;
if(age >= 18)
printf("成年\n");
else
printf("未成年\n");
return 0;
}
那么這段代碼執行之后結果為:

當把age賦值為10,那么結果為:

如果我們在printf(“未成年\n”)下面再加上一條陳述句,比如printf(“要好好學習\n”),同時,我們將age賦值為20,那么此時,這段代碼的執行結果應該為:成年,那會不會真的如我們所料呢?我們可以執行來看一看,

這時候,要好好學習也被列印出來了,這是為什么呢?
因為if和else后面只能控制一條陳述句,如果想控制多條陳述句,就得加上{},
例如:
int main()
{
int age = 20;
if (age >= 18)
printf("成年\n");
else
{
printf("未成年\n");
printf("要好好學習\n");
}
return 0;
}
那么當我們再次運行的時候,這段代碼只會列印成年,

如果我們將age改為10,那么結果為:

下面我們列舉多分支結構的具體例子:
int main()
{
int age = 60;
if (age <= 7)
{
printf("幼年\n");
}
else if (age > 7 && age <= 16)
{
printf("少年\n");
}
else if (age > 16 && age <= 45)
{
printf("青年\n");
}
else if (age > 45 && age <= 65)
{
printf("中年\n");
}
else
{
printf("老年\n");
}
return 0;
}
那么這段代碼的結果為:

注:&&的用法已經在上一集介紹過,這里的age > 7 && age <= 16意思為age大于7,小于等于16,在C語言中,表示age大于7,小于等于16不能寫成7<age<=16,
如果寫成這樣,那么當age賦值為60的時候,這條運算式仍為真,我們可以驗證一下:

因為這條陳述句是這樣執行的:age>7,為真,那么age>7的結果為1,而1小于16,所以7<age<=16的結果為真,則執行printf(“少年\n”),所以最終列印少年,
當然,上面這段代碼也可以寫為:
int main()
{
int age = 60;
if (age <= 7)
{
printf("幼年\n");
}
else if (age <= 16)
{
printf("少年\n");
}
else if (age <= 45)
{
printf("青年\n");
}
else if (age <= 65)
{
printf("中年\n");
}
else
{
printf("老年\n");
}
return 0;
}
這兩段代碼所表示的意思是一樣的,
懸空else
我們先來看這樣一段代碼
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
如果我們通過直覺判斷,這段代碼最后的結果應該是列印haha,那么結果真的如我們所料嗎?我們可以驗證一下:

我們可以看到,這段代碼最終結果是什么都沒列印,為什么會這樣呢?
因為else與離它最近的if匹配,也就是說,這段代碼相當于:
int main()
{
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
}
return 0;
}
因為a不等于1,所以最終什么都沒列印,
switch陳述句
switch陳述句的使用
switch陳述句也是一種分支陳述句,常用于多分支情況,語法形式為:
switch(整型運算式)
{
陳述句項;
}
陳述句項為case陳述句,形式為:
case 整型常量運算式:
陳述句;
我們舉個具體的例子,例如我們輸入幾,那么就列印星期幾,具體代碼如下:
#include<stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期一\n");
case 2:
printf("星期二\n");
case 3:
printf("星期三\n");
case 4:
printf("星期四\n");
case 5:
printf("星期五\n");
case 6:
printf("星期六\n");
case 7:
printf("星期七\n");
}
return 0;
}
這段代碼就很好的體現了switch陳述句和case陳述句的用法:給day賦一個值,例如賦值3,那么就執行case 3后面的陳述句,我們可以來驗證一下:

通過這個結果我們可以知道,給day賦值3,那么代碼就會從case 3之后開始執行,直到執行到case 7,也就是說,switch后面的整型常量運算式決定了陳述句項的入口,但是,我們要的效果是:輸入幾,就只列印星期幾,要想實作這樣的結果,就得使用一個關鍵字——break,
switch陳述句中的break
break意為跳出,決定了出口,上述代碼修改后為:
#include<stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期七\n");
break;
}
return 0;
}
我們可以來驗證一下,例如我們輸入3:

那么case后面一定得加break嗎?未必,這就得根據需求來決定了,比如:如果我們輸入1-5,就列印作業日,輸入6-7,就列印休息日,具體代碼如下:
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("作業日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
}
return 0;
}
我們可以來驗證一下,例如輸入2:

所以case后面的break不是一定得加上的,
default子句
我們使用switch陳述句的時候可能會出現這種情況:運算式的值與所有的case后面的值都不匹配,這時程式不會終止,也不會報錯,因為這種情況在C語言中并不認為適合錯誤,只是所有陳述句都被跳過而已,但是,如果我們并不想忽略不匹配的所有陳述句,那么可以在陳述句串列中增加一條default子句,格式如下:
default:
陳述句;
當switch運算式的值與所有case標簽的值都不匹配的時候,程式就將執行default子句后面的陳述句,因此,每個switch陳述句中只能出現一條default陳述句,但它可以出現在陳述句串列的任何位置,
例如,還是上述那段代碼——輸入幾,就列印星期幾,如果我們加上default子句:
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期七\n");
break;
default:
printf("輸入錯誤\n");
break;
}
return 0;
}
我們在default子句后面加上了printf(“輸入錯誤\n”),那么當我們輸入的不是1—7,那么就會列印輸入錯誤,例如我們輸入8:

這就是default子句的使用,
回圈陳述句
while回圈
while回圈的使用
while回圈的語法結構為:
while(運算式)
回圈陳述句;
如果運算式的結果為真(非零),那么就執行回圈陳述句;如果運算式的結果為假(零),那么就不執行回圈陳述句,
例如我們用while回圈來實作列印1—10,代碼如下:
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
i++;
}
return 0;
}
我們可以驗證一下:

while回圈中的break
在while回圈中,break用于永久終止回圈,例如下面這段代碼:
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
break;
printf("%d ", i);
i++;
}
return 0;
}
這時,當i等于5時,回圈就會終止,最終列印結果為1 2 3 4,我們來驗證一下:

這就是while回圈中break的使用,
while回圈中的continue
在while回圈中,continue的作用是跳過本次回圈中continue后邊的代碼,直接去判斷部分,判斷是否進行下一次回圈,例如下面這段代碼:
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;
printf("%d ", i);
i++;
}
return 0;
}
當i等于5的時候,程式并不會向下執行,列印5,而是會自動轉到while(i <= 10)進行判斷,所以i就一直為5,這段代碼最終就會死回圈,我們來驗證一下:

游標一直閃,說明程式并未結束,而是死回圈,
這就是while回圈中continue的使用,
for回圈
for回圈的使用
for回圈的語法形式:
for(運算式1;運算式2;運算式3)
回圈陳述句;
運算式1為初始化部分,用于初始化回圈變數;運算式2為條件判斷部分,用于判斷回圈何時終止;運算式3為調整部分,用于回圈條件的調整,
我們來舉一個具體的例子,例如:用for回圈列印1—10,具體代碼如下:
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}
執行結果如下:

在這段代碼中,i=1為初始化部分,i<=10為判斷部分,i++為調整部分,
那么while回圈和for回圈的區別在哪?
int i = 0;
//實作相同的功能,使用while
i = 1;//初始化部分
while(i<=10)//判斷部分
{
printf("%d ",i);
i++;//調整部分
}
//實作相同的功能,使用for
for(i = 1;i <= 10;i++)
{
printf("%d ",i);
}
可以發現,在while回圈中依然存在回圈的三個必須條件,但是由于風格的問題使得三個部分很可能偏離較遠,這樣查找修改就不夠集中和方便,所以,for回圈的風格更勝一籌,for回圈的使用頻率更高,
for回圈中的break
在for回圈中,break用于終止回圈,
例如下面這段代碼:
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
break;
printf("%d ", i);
}
return 0;
}
那么最終結果應該是列印1 2 3 4,我們可以來驗證一下:

這就是for回圈中的break的使用,
for回圈中的continue
在for回圈中,continue的作用是跳過本次回圈中continue后邊的代碼,直接去調整部分,然后再判斷是否進行下一次回圈,
例如下面這段代碼:
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
那么這段代碼的最終結果應該是列印1 2 3 4 6 7 8 9 10,我們來驗證一下:

這就是for回圈中continue的使用,
for回圈的變種
變種一
for(;;)
這種是將三個部分都省略,但當判斷部分省略的時候,判斷部分恒為真,就會造成死回圈,例如這段代碼:
int main()
{
for (;;)
{
printf("hehe\n");
}
return 0;
}
執行結果為:

這樣就會造成死回圈,
變種二
for回圈中兩個變數,例如下面這段代碼:
int main()
{
int x = 0;
int y = 0;
for (x = 0, y = 0; x < 2 && y < 5; x++, y++)
{
printf("hehe\n");
}
return 0;
}
我們可以運行一下:

那么這段代碼就說明,for回圈的三個部分中是支持有兩個變數存在的,
do…while()回圈
do…while回圈的使用
do…while()回圈的語法為:
do
回圈陳述句;
while(運算式);
先執行一次回圈陳述句,然后再進行判斷,如果運算式為真,則再進入回圈:如果運算式為假,則跳出回圈,
下面我們來舉個例子,例如:列印數字1—10,具體代碼如下:
int main()
{
int i = 1;
do
{
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
代碼執行結果為:

do…while()回圈中的continue和break
do…while()回圈中的continue和break與while回圈中的continue和break作用相同,這里就不再詳細講解,下面兩段代碼即為continue和break在do…while()回圈中的應用:


goto陳述句
C語言中提供了可以隨意濫用的goto陳述句和標記跳轉的標號,從理論上goto陳述句是沒有必要的,實踐中沒有goto陳述句也可以很容易地寫出代碼,但是在某些場合下goto陳述句還是用得著的,最常見的用法就是終止程式在某些深度嵌套的結構的處理程序,例如一次跳出兩層或多層回圈,這種情況使用break是達不到目的的,它只能從最內層回圈退出到上一層的回圈,
我們舉個具體的例子:
int main()
{
flag:
printf("hehe\n");
printf("haha\n");
goto flag;
return 0;
}
當然,這段代碼是死回圈,我們可以運行看一下結果:

如果大家有興趣,可以看看這篇博客——使用goto陳述句個性關機,看完之后或許對goto陳述句有個更深刻的理解,
當然,goto陳述句真正適合的場景如下:
for(...)
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
...
error:
if(disaster)
//處理錯誤情況
注:goto陳述句只能在一個函式范圍內跳轉,不能跨函式
例如:
void test()
{
flag:
printf("test\n");
}
int main()
{
goto flag;
return 0;
}
那么這段代碼的執行結果為:

所以,goto陳述句只能在一個函式范圍內跳轉,不能跨函式,
本集完!!!
上一集:Hello!C先生
下一集預告:函式帝國的崛起
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/282557.html
標籤:AI
下一篇:使用YOLOV3訓練自己的資料集
