本章目錄
- 溫馨提示
- 本章重點
- 正文開始
- 1. 什么是陳述句?
- 2. 分支陳述句(選擇結構)
- 2.1 if陳述句
- 2.1.1 懸空else
- 2.1.2 if書寫形式的對比
- 2.2 switch陳述句
- 2.2.1 在switch陳述句中的 break
- 2.2.2 default子句
- 2.2.3 練習
- 3.回圈陳述句
- 3.1 while回圈
- 3.1.1 while陳述句中的break和continue
- 3.2 for回圈
- 3.2.1 for回圈的語法結構
- 3.2.2 break和continue在for回圈中
- 3.2.3 for陳述句的回圈控制變數
- 3.2.4 一些for回圈的變種
- 3.2.5 一道筆試題
- 3.3 do...while回圈
- 3.3.2 do陳述句的特點
- 3.3.3 do while回圈中的break和continue
- 3.4 適合本章的練習題(不展示代碼)
- 4. goto陳述句
- 全文結束(尾聲)
溫馨提示
大家好我是Cbiltps,在我的博客中如果有難以理解的句意,難以用文字表達的重點,我會有配圖,所以我的博客配圖非常重要!!!
如果你對我感興趣請看我的第一篇博客!
本章重點
分支陳述句
- if
- switch
回圈陳述句
- while
- for
- do while
goto陳述句
正文開始
1. 什么是陳述句?
C語言中由一個分號; 隔開的就是一條陳述句,
//比如:
int a = 0;
printf("hehe");
1+2;
;//空陳述句
2. 分支陳述句(選擇結構)
如果你好好學習,校招時拿一個好offer,走上人生巔峰,
如果你不學習,畢業等于失業,回家賣紅薯,
這就是選擇!

2.1 if陳述句
if陳述句的語法結構:
if(運算式)
陳述句;
if(運算式)
陳述句1;
else
陳述句2;
//多分支
if(運算式1)
陳述句1;
else if(運算式2)
陳述句2;
else
陳述句3;
演示代碼(簡寫):
if (age >= 18)
printf("成年\n");
if (age >= 18)
printf("成年\n");
else
printf("未成年\n");
if (age < 18)
printf("未成年\n");
else if (age >= 18 && age < 30)
printf("青年\n");
else if (age >= 30 && age < 55)
printf("中年\n");
else if (age >= 55 && age < 70)
printf("中老年\n");
else if (age >= 70 && age < 100)
printf("老年\n");
else
printf("老不死\n");*/
解釋一下:
如果運算式的結果為真,則陳述句執行,
在C語言中如何表示真偽?
0表示假,非0表示真,
if陳述句的注意點(錯誤代碼展示):
if (18 < age < 30) //錯誤
if (age >= 18 && age < 30) //修改后
//這樣的寫法很麻煩,會判斷很多次
if (age < 18)
printf("未成年\n");
if (age >= 18 && age < 30)
printf("青年\n");
if (age >= 30 && age < 55)
printf("中年\n");
if (age >= 55 && age < 70)
printf("中老年\n");
if (age >= 70 && age < 100)
printf("老年\n");
if(age>=100)
printf("老壽星\n");
//修改后的代碼,只需要一次
if (age < 18)
printf("未成年\n");
else if (age >= 18 && age < 30)
printf("青年\n");
else if (age >= 30 && age < 55)
printf("中年\n");
else if (age >= 55 && age < 70)
printf("中老年\n");
else if (age >= 70 && age < 100)
printf("老年\n");
else
printf("老不死\n");*/
//if后面默認只能跟一條陳述句
if (age >= 18)
printf("成年\n");
printf("可以談戀愛\n");
else
printf("未成年\n");
//修改后就不會出現問題了
if (age >= 18)
{
printf("成年\n");
printf("可以談戀愛\n");
}
else
{
printf("未成年\n");
}
如果條件成立,要執行多條陳述句,怎應該使用代碼塊,
#include <stdio.h>
int main()
{
if (運算式)
{
陳述句串列1;
}
else
{
陳述句串列2;
}
return 0;
}
這里的一對 { } 就是一個代碼塊,
2.1.1 懸空else
當你寫了這段代碼
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
運行結果如下:
原因是第一個if的條件 a≠0 條件不允許執行
優化改正:
//適當的使用{}可以使代碼的邏輯更加清楚,
//代碼風格很重要
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
{
printf("hehe\n");
}
}
else
{
printf("haha\n");
}
return 0;
}
else的匹配: else是和它離的最近的if匹配的,
2.1.2 if書寫形式的對比
//代碼1
if (condition) {
return x;
}
return y;
//代碼2
if (condition)
{
return x;
}
else
{
return y;
}
/代碼3
int num = 1;
if (num == 5)
{
printf("hehe\n");
}
//代碼4
int num = 1;
if (5 == num)//如果是(num == 5)的話,有可能錯寫成(num = 5),會產生bug;但如果是(num = 5),編譯會出錯,便于發現錯誤
{
printf("hehe\n");
}
代碼2和代碼4更好,邏輯更加清晰,不容易出錯,
2.2 switch陳述句
switch陳述句也是一種分支陳述句,
常常用于多分支的情況,
比如:
輸入1,輸出星期一
輸入2,輸出星期二
輸入3,輸出星期三
輸入4,輸出星期四
輸入5,輸出星期五
輸入6,輸出星期六
輸入7,輸出星期日
switch陳述句的語法結構:
switch(整型運算式)//switch 后面的運算式必須是整形運算式,不能使用float型
{
陳述句項;
}
而陳述句項是什么呢?
//是一些case陳述句:
//如下:
case 整形常量運算式://注意是 整形 常量 運算式,不是變數
陳述句;
2.2.1 在switch陳述句中的 break
在switch陳述句中,我們沒法直接實作分支,搭配break使用才能實作真正的分支,
//代碼演示:
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1://每一個case就是一個陳述句項,case陳述句是入口
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;
}
有時候我們的需求變了:
- 輸入1-5輸出的是“weekday”;
- 輸入6-7輸出“weekend”
所以我們的代碼就應該這樣實作了(部分關鍵代碼):
switch (day)
{
case 1:
printf("weekday\n");
break;
case 2:
printf("weekday\n");
break;
case 3:
printf("weekday\n");
break;
case 4:
printf("weekday\n");
break;
case 5:
printf("weekday\n");
break;
case 6:
printf("weekend\n");
break;
case 7:
printf("weekend\n");
break;
}
但是這樣的代碼非常冗余,這樣優化會更好:
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday\n");
break;
case 6:
case 7:
printf("weekend\n");
break;
}
所以說,case陳述句 的后面一點要加 break 嗎?
不是的,是根據需求來決定的,
編程好習慣:
在最后一個 case 陳述句的后面加上一條 break陳述句,(之所以這么寫是可以避免出現在以前的最后一個 case 陳述句后面忘了添加 break陳述句),
2.2.2 default子句
如果表達的值與所有的case標簽的值都不匹配怎么辦?
其實也沒什么,結構就是所有的陳述句都被跳過而已, 程式并不會終止,也不會報錯,因為這種情況在C中并不認為適合錯誤,
但是,如果你并不想忽略不匹配所有標簽的運算式的值時該怎么辦呢?
你可以在陳述句串列中增加一條default子句,switch運算式的值并不匹配所有case標簽的值時,這個default子句后面的陳述句就會執行,
所以,每個switch陳述句中只能出現一條default子句,
但是它可以出現在陳述句串列的任何位置,而且陳述句流會像貫穿一個case標簽一樣貫穿default子句,
再次把上面的代碼優化:
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday\n");
break;
case 6:
case 7:
printf("weekend\n");
break;
default://放在前面或者后面都可以,建議放在最后面,符合邏輯
printf("輸入錯誤!\n");
break;
}
編程好習慣:
在每個 switch 陳述句中都放一條default子句是個好習慣,甚至可以在后邊再加一個 break ,
2.2.3 練習
#include <stdio.h>
int main()
{
int n = 1;
int m = 2;
switch (n)
{
case 1:
m++;//3
case 2:
n++;//2
case 3:
switch (n)
{//switch允許嵌套使用
case 1:
n++;
case 2:
m++;//4
n++;//3
break;
}
case 4:
m++;//5
break;
default:
break;
}
printf("m = %d, n = %d\n", m, n);//m = 5, n = 3
return 0;
}
3.回圈陳述句
- while
- for
- do while

3.1 while回圈
我們已經掌握了 if陳述句,當條件滿足的情況下,if陳述句 后的陳述句執行,否則不執行,
但是這個陳述句只會執行一次,
但是我們發現生活中很多的實際的例子是:同一件事情我們需要完成很多次,
那我們怎么做呢?
C語言中給我們引入了:while陳述句,可以實作回圈,
while陳述句的語法結構:
while(運算式)
回圈陳述句;
while陳述句執行的流程:
比如我們實作:
在螢屏上列印1-10的數字,
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
i = i + 1;
}
return 0;
}
3.1.1 while陳述句中的break和continue
break介紹
//break 代碼實體
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
break;//直接終止回圈
printf("%d ", i);//列印出來是:1 2 3 4
i = i + 1;
}
return 0;
}
總結:
break在while回圈中的作用:
其實在回圈中只要遇到break,就停止后期的所有的回圈,直接終止回圈,
所以:while中的break是用于永久終止回圈的,
continue介紹
//break 代碼實體
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;//跳過本次回圈contiune后的代碼
printf("%d ", i);//列印出來的是1 2 3 4
i = i + 1;
}
return 0;
}
總結:
continue在while回圈中的作用就是:
continue是用于終止本次回圈的,也就是本次回圈中continue后邊的代碼不會再執行,而是直接
跳轉到while陳述句的判斷部分,進行下一次回圈的入口判斷,
3.2 for回圈
我們已經知道了 while回圈 ,但是 while回圈 有一定的局限性,
現在我們對比一下 while 和 for回圈 :
//實作相同的功能,使用while
int i = 1;//初始化部分
while(i<=10)//判斷部分
{
printf("hehe\n");
i = i+1;//調整部分
}
//實作相同的功能,使用for
for(i=1; i<=10; i++)//for(i=1/*初始化*/; i<=10/*判斷部分*/; i++/*調整部分*/)
{
printf("hehe\n");
}
我們看到實作相同的功能 for回圈 更簡單
所以,出現了 for回圈 ,
3.2.1 for回圈的語法結構
for(運算式1;運算式2;運算式3)
回圈陳述句;
- 運算式1為初始化部分,用于初始化回圈變數的,
- 運算式2為條件判斷部分,用于判斷回圈時候終止,
- 運算式3為調整部分,用于回圈條件的調整,
for陳述句執行的流程:
實際的問題:
使用for回圈 在螢屏上列印1-10的數字,
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}
3.2.2 break和continue在for回圈中
我們發現在for回圈中也可以出現break和continue,他們的意義和在while回圈中是一樣的,
但是還是有些差異:
break在for回圈中:
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (5 == i)
break;//直接跳出回圈
printf("%d ", i);//列印出:1 2 3 4
}
return 0;
}
總結:
break在for回圈中的作用:
在回圈中只要遇到break,就停止后期的所有的回圈,直接跳出回圈,
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{i
if (5 == i)
continue;//跳出本本次回圈,來到調整部分,進入下一次回圈
printf("%d ", i);//列印的結果是:1 2 3 4 6 7 8 9 10
}
return 0;
}
總結:
continue在for回圈中的作用就是:
continue是用于跳出本本次回圈,來到調整部分,進入下一次回圈,
3.2.3 for陳述句的回圈控制變數
一些建議:
1. 不可在for 回圈體內修改回圈變數,防止 for 回圈失去控制,
錯誤演示:
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", i);
i = 5;//不要這樣修改變數,這樣列印出來無限回圈的 6
}
2. 建議for陳述句的回圈控制變數的取值采用“前閉后開區間”寫法(看情況,不是一定),
//兩邊都是閉區間
for(i=0; i<=9; i++)
{}
int i = 0;
//前閉后開的寫法
for(i=0; i<10; i++)//是為了看出回圈了10次
{}
3.2.4 一些for回圈的變種
//變種1;
for (;;)
{
printf("hehe\n");//這樣會無限列印
//容易出現bug
}
int i = 0;
int j = 0;
for (; i < 10; i++)
{
for (; j < 10; j++)
{
printf("hehe\n");//這樣只會列印10次,不會列印100次,
//因為j到達10后,就一直是10,無法重新計為1
//容易出現bug
}
}
for回圈的初始化,判斷,調整三個部分是可以省略的,其中的判斷部分如果省略,則判斷條件恒為真,建議不要輕易省略,
//變種2:這樣子寫是可以的
int x, y;
for (x = 0, y = 0; x < 2 && y < 5; ++x, y++)// 可以看一下下面的筆試題
{
printf("hehe\n");
}
3.2.5 一道筆試題
//請問回圈要回圈多少次?
#include <stdio.h>
int main()
{
int i = 0;
int k = 0;
for (i = 0, k = 0; k = 0; i++, k++)
k++;
return 0;
}
答案是一次都不會回圈,因為0表示假,就不會進入回圈,
3.3 do…while回圈
do…while陳述句的語法:
do
{
回圈陳述句;
}
while (運算式);
do執行流程:
3.3.2 do陳述句的特點
回圈至少執行一次,使用的場景有限,所以不是經常使用,\
//do陳述句代碼演示:
#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("%d\n", i);//列印1到10
} while (i < 10);
return 0;
}
3.3.3 do while回圈中的break和continue
do while回圈中的break:
int main()
{
int i = 1;
do
{
printf("%d ", i);
if (i == 5)
break;//列印 1 2 3 4 5后終止回圈
i++;
} while (i <= 10);
}
return 0;
}
do while回圈中的continue:
int main()
{
int i = 1;
do
{
printf("%d ", i);
if (i == 5)
continue;//列印 1 2 3 4 和5的無限回圈
i++;
} while (i <= 10);
return 0;
}
3.4 適合本章的練習題(不展示代碼)
- 計算 n的階乘,
- 計算 1!+2!+3!+……+10!
- 在一個有序陣列中查找具體的某個數字n,
撰寫int binary_search(int x, int v[], int n);
功能:在v[0]<=v[1]<=v[2]<= ….<=v[n-1]的陣列中查找x. - 撰寫代碼,演示多個字符從兩端移動,向中間匯聚,
- 撰寫代碼實作,模擬用戶登錄情景,并且只能登錄三次,(只允許輸入三次密碼,如果密碼正確則
提示登錄成,如果三次均輸入錯誤,則退出程式,
4. goto陳述句
C語言中提供了可以隨意濫用的 goto陳述句 和標記跳轉的標號,
從理論上 goto陳述句是沒有必要的,實踐中沒有goto陳述句也可以很容易的寫出代碼,
但是某些場合下goto陳述句還是用得著的,最常見的用法就是終止程式在某些深度嵌套的結構的處理過
程,例如一次跳出兩層或多層回圈,
這種情況使用break是達不到目的的,它只能從最內層回圈退出到上一層的回圈,
下面是使用goto陳述句的一個例子:
關機程式:
只要程式運行起來,電腦就倒計時1分鐘
1分鐘后就關機,如果在1分鐘內,輸入:我是豬,就取消關機
shutdown -s -t 60 - 倒計時60秒關機
shutdown -a - 取消關機
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char input[20] = { 0 };
//倒計時關機
system("shutdown -s -t 60");
again:
printf("請注意,你的電腦在1分鐘內關機,如果輸入:我是豬,就取消關機\n");
scanf("%s", input);
//判斷用戶輸入的是不是:我是豬
if (0 == strcmp(input, "我是豬"))//2個字串比較不能使用==,要使用strcmp string compare
{
system("shutdown -a");
}
else
{
goto again;
}
return 0;
}
goto陳述句真正適合的場景如下:
for (...)
{
for (...)
{
for (...)
{
if (disaster)
goto error;
}
}
}
…
error :
if (disaster)
// 處理錯誤情況,跳出兩個或多個回圈
全文結束(尾聲)
恭喜你對于分支陳述句和回圈陳述句有了全面的認識,如果你有不解的困惑,可以評論或者私信留言,
再次感謝你們的閱覽觀看,你們的支持就是我源源不斷的動力!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/295222.html
標籤:其他
上一篇:Python 命令列引數詳解




