分支語(yǔ)句
- if
- switch
循環(huán)語(yǔ)句
- while
- for
- do while
goto語(yǔ)句
1. 什么是語(yǔ)句?
C語(yǔ)句可分為以下五類(lèi):
1. 表達(dá)式語(yǔ)句
2. 函數(shù)調(diào)用語(yǔ)句
3. 控制語(yǔ)句
4. 復(fù)合語(yǔ)句
5. 空語(yǔ)句
本章后面介紹的是控制語(yǔ)句。
控制語(yǔ)句用于控制程序的執(zhí)行流程,以實(shí)現(xiàn)程序的各種結(jié)構(gòu)方式(C語(yǔ)言支持三種結(jié)構(gòu):順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)),它們由特定的語(yǔ)句定義符組成,C語(yǔ)言有九種控制語(yǔ)句。
可分成以下三類(lèi):
1. 條件判斷語(yǔ)句也叫分支語(yǔ)句:if語(yǔ)句、switch語(yǔ)句;
2. 循環(huán)執(zhí)行語(yǔ)句:do while語(yǔ)句、while語(yǔ)句、for語(yǔ)句;
3. 轉(zhuǎn)向語(yǔ)句:break語(yǔ)句、goto語(yǔ)句、continue語(yǔ)句、return語(yǔ)句。
2. 分支語(yǔ)句(選擇結(jié)構(gòu))
如果你好好學(xué)習(xí),校招時(shí)拿一個(gè)好offer,走上人生巔峰。
如果你不學(xué)習(xí),畢業(yè)等于失業(yè),回家賣(mài)紅薯。
這就是選擇!
2.1 if語(yǔ)句
*那if語(yǔ)句的語(yǔ)法結(jié)構(gòu)是怎么樣的呢?
語(yǔ)法結(jié)構(gòu):
if(表達(dá)式)
語(yǔ)句;
if(表達(dá)式)
語(yǔ)句1;
else
語(yǔ)句2;
//多分支
if(表達(dá)式1)
語(yǔ)句1;
else if(表達(dá)式2)
語(yǔ)句2;
else
語(yǔ)句3;
代碼演示:
#include <stdio.h>
//代碼1
int main()
{
int age = 0;
scanf("%d", &age);
if(age<18)
{
printf("未成年\n");
}
}
//代碼2
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age<18)
{
printf("未成年\n");
}
else
{
printf("成年\n");
}
}
//代碼3
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age<18)
{
printf("少年\n");
}
else if(age>=18 && age<30)
{
printf("青年\n");
}
else if(age>=30 && age<50)
{
printf("中年\n");
}
else if(age>=50 && age<80)
{
printf("老年\n");
}
else
{
printf("老壽星\n");
}
}
解釋一下:
如果表達(dá)式的結(jié)果為真,則語(yǔ)句執(zhí)行。
在C語(yǔ)言中如何表示真假?
0表示假,非0表示真。
如果條件成立,要執(zhí)行多條語(yǔ)句,怎應(yīng)該使用代碼塊。
#include <stdio.h>
int main()
{
if(表達(dá)式)
{
語(yǔ)句列表1;
}
else
{
語(yǔ)句列表2;
}
return 0;
}
這里的一對(duì) { } 就是一個(gè)代碼塊。
2.1.1 懸空else
當(dāng)你寫(xiě)了這個(gè)代碼
#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;
}
改正:
//適當(dāng)?shù)氖褂脅}可以使代碼的邏輯更加清楚。
//代碼風(fēng)格很重要
#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書(shū)寫(xiě)形式的對(duì)比
//代碼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)
{
printf("hehe\n");
}
代碼2和代碼4更好,邏輯更加清晰,不容易出錯(cuò)
2.2 switch語(yǔ)句
switch語(yǔ)句也是一種分支語(yǔ)句。
常常用于多分支的情況。
比如
輸入1,輸出星期一
輸入2,輸出星期二
輸入3,輸出星期三
輸入4,輸出星期四
輸入5,輸出星期五
輸入6,輸出星期六
輸入7,輸出星期日
那我沒(méi)寫(xiě)成 if…else if …else if 的形式太復(fù)雜,那我們就得有不一樣的語(yǔ)法形式。
這就是switch語(yǔ)句。
switch(整型表達(dá)式)
{
語(yǔ)句項(xiàng);
}
而語(yǔ)句項(xiàng)是什么呢?
//是一些case語(yǔ)句:
//如下:
case 整形常量表達(dá)式:
語(yǔ)句;
2.2.1 在switch語(yǔ)句中的break
在switch語(yǔ)句中,我們沒(méi)辦法直接實(shí)現(xiàn)分支,搭配break使用才能實(shí)現(xiàn)真正的分支。
比如:
#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;
}
有時(shí)候我們的需求變了:
- 輸入1-5,輸出的是“weekday”;
- 輸入6-7,輸出“weekend”
所以我們的代碼就應(yīng)該這樣實(shí)現(xiàn)了:
#include <stdio.h>
//switch代碼演示
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday\n");
break;
case 6:
case 7:
printf("weekend\n");
break;
}
return 0;
}
break語(yǔ)句 的實(shí)際效果是把語(yǔ)句列表劃分為不同的分支部分。
編程好習(xí)慣
在最后一個(gè) case 語(yǔ)句的后面加上一條 break語(yǔ)句。
(之所以這么寫(xiě)是可以避免出現(xiàn)在以前的最后一個(gè) case 語(yǔ)句后面忘了添加 break語(yǔ)句)。
2.2.2 default子句
如果表達(dá)的值與所有的case標(biāo)簽的值都不匹配怎么辦?
其實(shí)也沒(méi)什么,結(jié)構(gòu)就是所有的語(yǔ)句都被跳過(guò)而已。
程序并不會(huì)終止,也不會(huì)報(bào)錯(cuò),因?yàn)檫@種情況在C中并不認(rèn)為是個(gè)錯(cuò)誤。
但是,如果你并不想忽略不匹配所有標(biāo)簽的表達(dá)式的值時(shí)該怎么辦呢?
你可以在語(yǔ)句列表中增加一條default子句,把下面的標(biāo)簽
default:
寫(xiě)在任何一個(gè)case標(biāo)簽可以出現(xiàn)的位置。
當(dāng)switch表達(dá)式的值并不匹配所有case標(biāo)簽的值時(shí),這個(gè)default子句后面的語(yǔ)句就會(huì)執(zhí)行。
所以,每個(gè)switch語(yǔ)句中只能出現(xiàn)一條default子句。
但是它可以出現(xiàn)在語(yǔ)句列表的任何位置,而且語(yǔ)句流會(huì)像執(zhí)行一個(gè)case標(biāo)簽一樣執(zhí)行default子句。
編程好習(xí)慣
在每個(gè) switch 語(yǔ)句中都放一條default子句是個(gè)好習(xí)慣,甚至可以在后邊再加一個(gè) break 。
2.2.3 練習(xí)
計(jì)算結(jié)果:
#include <stdio.h>
int main()
{
int n = 1;
int m = 2;
switch (n)
{
case 1:
m++;
case 2:
n++;
case 3:
switch (n)
{//switch允許嵌套使用
case 1:
n++;
case 2:
m++;
n++;
break;
}
case 4:
m++;
break;
default:
break;
}
printf("m = %d, n = %d\n", m, n);
return 0;
}
3. 循環(huán)語(yǔ)句
- while
- for
- do while
3.1 while循環(huán)
我們已經(jīng)掌握了,if語(yǔ)句:
if(條件)
語(yǔ)句;
當(dāng)條件滿(mǎn)足的情況下,if語(yǔ)句后的語(yǔ)句執(zhí)行,否則不執(zhí)行。
但是這個(gè)語(yǔ)句只會(huì)執(zhí)行一次。
由于我們發(fā)現(xiàn)生活中很多的實(shí)際的例子是:同一件事情我們需要完成很多次。
那我們?cè)趺醋瞿兀?br> C語(yǔ)言中給我們引入了: while 語(yǔ)句,可以實(shí)現(xiàn)循環(huán)。
//while 語(yǔ)法結(jié)構(gòu)
while(表達(dá)式)
循環(huán)語(yǔ)句;
while語(yǔ)句執(zhí)行的流程:
比如我們實(shí)現(xiàn):
在屏幕上打印1-10的數(shù)字。
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
printf("%d ", i);
i = i+1;
}
return 0;
}
上面的代碼已經(jīng)幫我了解了while語(yǔ)句的基本語(yǔ)法,那我們?cè)倭私庖幌拢?/p>
3.1.1 while語(yǔ)句中的break和continue
break介紹
//break 代碼實(shí)例
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
break;
printf("%d ", i);
i = i+1;
}
return 0;
}
代碼輸出結(jié)果:
總結(jié):
break在while循環(huán)中的作用:
其實(shí)在循環(huán)中只要遇到break,就停止后期的所有的循環(huán),直接終止循環(huán)。
所以:while中的break是用于永久終止循環(huán)的。
continue介紹
//continue 代碼實(shí)例1
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
continue;
printf("%d ", i);
i = i+1;
}
return 0;
}
代碼輸出結(jié)果:
//continue 代碼實(shí)例2
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
i = i+1;
if(i == 5)
continue;
printf("%d ", i);
}
return 0;
}
上面兩個(gè)例子對(duì)比思考,加深理解。
總結(jié):
continue在while循環(huán)中的作用就是:
continue是用于終止本次循環(huán)的,也就是本次循環(huán)中continue后邊的代碼不會(huì)再執(zhí)行,而是直接跳轉(zhuǎn)到while語(yǔ)句的判斷部分。進(jìn)行下一次循環(huán)的入口判斷。
3.2 for循環(huán)
我們已經(jīng)知道了while循環(huán),但是我們?yōu)槭裁催€要一個(gè)for循環(huán)呢?
首先來(lái)看看for循環(huán)的語(yǔ)法:
3.2.1 語(yǔ)法
for(表達(dá)式1; 表達(dá)式2; 表達(dá)式3)
循環(huán)語(yǔ)句;
表達(dá)式1
表達(dá)式1為初始化部分,用于初始化循環(huán)變量的。
表達(dá)式2
表達(dá)式2為條件判斷部分,用于判斷循環(huán)時(shí)候終止。
表達(dá)式3
表達(dá)式3為調(diào)整部分,用于循環(huán)條件的調(diào)整。
實(shí)際的問(wèn)題:
使用for循環(huán) 在屏幕上打印1-10的數(shù)字。
#include <stdio.h>
int main()
{
int i = 0;
//for(i=1/*初始化*/; i<=10/*判斷部分*/; i++/*調(diào)整部分*/)
for(i=1; i<=10; i++)
{
printf("%d ", i);
}
return 0;
}
for循環(huán)的執(zhí)行流程圖:
現(xiàn)在我們對(duì)比一下for循環(huán)和while循環(huán)。
int i = 0;
//實(shí)現(xiàn)相同的功能,使用while
i=1;//初始化部分
while(i<=10)//判斷部分
{
printf("hehe\n");
i = i+1;//調(diào)整部分
}
//實(shí)現(xiàn)相同的功能,使用while
for(i=1; i<=10; i++)
{
printf("hehe\n");
}
可以發(fā)現(xiàn)在while循環(huán)中依然存在循環(huán)的三個(gè)必須條件,但是由于風(fēng)格的問(wèn)題使得三個(gè)部分很可能偏離較遠(yuǎn),這樣查找修改就不夠集中和方便。所以,for循環(huán)的風(fēng)格更勝一籌;for循環(huán)使用的頻率也最高。
3.2.2 for語(yǔ)句的循環(huán)控制變量
建議:
- 不可在for 循環(huán)體內(nèi)修改循環(huán)變量,防止 for 循環(huán)失去控制。
- 建議for語(yǔ)句的循環(huán)控制變量的取值采用“前閉后開(kāi)區(qū)間”寫(xiě)法。
int i = 0;
//前閉后開(kāi)的寫(xiě)法
for(i=0; i<10; i++)
{}
//兩邊都是閉區(qū)間
for(i=0; i<=9; i++)
{}
3.2.3 一些for循環(huán)的變種
#include <stdio.h>
int main()
{
//代碼1
for(;;)
{
printf("hehe\n");
}
//for循環(huán)中的初始化部分,判斷部分,調(diào)整部分是可以省略的,但是不建議初學(xué)時(shí)省略,容易導(dǎo)致問(wèn)
題。
//代碼2
int i = 0;
int j = 0;
//這里打印多少個(gè)hehe?
for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
{
printf("hehe\n");
}
}
//代碼3
int i = 0;
int j = 0;
//如果省略掉初始化部分,這里打印多少個(gè)hehe?
for(; i<10; i++)
{
for(; j<10; j++)
{
printf("hehe\n");
}
}
//代碼4-使用多余一個(gè)變量控制循環(huán)
int x, y;
for (x = 0, y = 0; x<2 && y<5; ++x, y++)
{
printf("hehe\n");
}
return 0;
}
3.2.4 一道筆試題:
請(qǐng)問(wèn)循環(huán)要循環(huán)多少次?
#include <stdio.h>
int main()
{
int i = 0;
int k = 0;
for(i =0,k=0; k=0; i++,k++)
k++;
return 0;
}
答案是“0次”,直接死循環(huán)了。
3.3 do…while()循環(huán)
3.3.1 do語(yǔ)句的語(yǔ)法:
do
循環(huán)語(yǔ)句;
while(表達(dá)式);
3.3.2 執(zhí)行流程
3.3.3 do語(yǔ)句的特點(diǎn)
循環(huán)至少執(zhí)行一次,使用的場(chǎng)景有限,所以不是經(jīng)常使用。
#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i);
i=i+1;
}while(i<=10);
return 0;
}
do while循環(huán)中的break和continue
#include <stdio.h>
int main()
{
int i = 1;
do
{
if(5 == i)
break;
printf("%d ", i);
i=i+1;
}while(i<=10);
return 0;
}
#include <stdio.h>
int main()
{
int i = 1;
do
{
if(5 == i)
continue;
printf("%d ", i);
i=i+1;
}while(i<=10);
return 0;
}
4. goto語(yǔ)句
C語(yǔ)言中提供了可以隨意濫用的 goto語(yǔ)句和標(biāo)記跳轉(zhuǎn)的標(biāo)號(hào)。
從理論上 goto語(yǔ)句是沒(méi)有必要的,實(shí)踐中沒(méi)有g(shù)oto語(yǔ)句也可以很容易的寫(xiě)出代碼。
但是某些場(chǎng)合下goto語(yǔ)句還是用得著的,最常見(jiàn)的用法就是終止程序在某些深度嵌套的結(jié)構(gòu)的處理過(guò)程。
例如:一次跳出兩層或多層循環(huán)。
多層循環(huán)這種情況使用break是達(dá)不到目的的。它只能從最內(nèi)層循環(huán)退出到上一層的循環(huán)。
goto語(yǔ)言真正適合的場(chǎng)景如下:
for(...)
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
…
error:
if(disaster)
// 處理錯(cuò)誤情況
下面是使用goto語(yǔ)句的一個(gè)例子,然后使用循環(huán)的實(shí)現(xiàn)方式替換goto語(yǔ)句:
一個(gè)關(guān)機(jī)程序
#include <stdio.h>
int main()
{
char input[10] = {0};
system("shutdown -s -t 60");
again:
printf("電腦將在1分鐘內(nèi)關(guān)機(jī),如果輸入:我是豬,就取消關(guān)機(jī)!\n請(qǐng)輸入:>");
scanf("%s", input);
if(0 == strcmp(input, "我是豬"))
{
system("shutdown -a");
}
else
{
goto again;
}
return 0;
}
而如果不適用goto語(yǔ)句,則可以使用循環(huán):文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-408990.html
#include <stdio.h>
#include <stdlib.h>
int main()
{
char input[10] = {0};
system("shutdown -s -t 60");
while(1)
{
printf("電腦將在1分鐘內(nèi)關(guān)機(jī),如果輸入:我是豬,就取消關(guān)機(jī)!\n請(qǐng)輸入:>");
scanf("%s", input);
if(0 == strcmp(input, "我是豬"))
{
system("shutdown -a");
break;
}
}
return 0;
}
關(guān)于shutdown命令的拓展
本章完,感謝您的閱讀,如果覺(jué)的有用的話(huà),請(qǐng)點(diǎn)贊支持一下,謝謝您。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-408990.html
到了這里,關(guān)于分支語(yǔ)句和循環(huán)語(yǔ)句的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!