C語(yǔ)言深入講解語(yǔ)句與選擇結(jié)構(gòu)的使用
知識(shí)點(diǎn)1-語(yǔ)句
1.1 語(yǔ)句
1.表達(dá)式語(yǔ)句
由一個(gè)表達(dá)式加分號(hào)構(gòu)成一個(gè)表達(dá)式語(yǔ)句,其一般形式如下:
表達(dá)式 ;
Q1:什么是表達(dá)式?
A1:表達(dá)式就是C語(yǔ)言中由運(yùn)算符和數(shù)據(jù)構(gòu)成的式子;表達(dá)式運(yùn)算的結(jié)果稱為表達(dá)式的值,以下都是一些常見的表達(dá)式。
//表達(dá)式
1
-5
4+20
x = q++ % 3
a*(b + c/d)/20
q > 3
kiko:因此表達(dá)式語(yǔ)句就是在上面這些表達(dá)式后面加一個(gè)分號(hào)就完事了~
//表達(dá)式語(yǔ)句
1;
-5;
4+20;
x = q++ % 3 ;
a*(b + c/d)/20 ;
q > 3;
2.控制語(yǔ)句
由名字可見,控制語(yǔ)句用于控制程序的執(zhí)行過程,它是由特定的語(yǔ)句定義的,我個(gè)人將C語(yǔ)言中的控制語(yǔ)句分為以下3類:
- 選擇語(yǔ)句:if-else語(yǔ)句、switch-case語(yǔ)句。
- 循環(huán)語(yǔ)句:while語(yǔ)句、do-while語(yǔ)句、break語(yǔ)句。
- 跳轉(zhuǎn)語(yǔ)句:break語(yǔ)句、goto語(yǔ)句、continue語(yǔ)句。
本期我們就講三類語(yǔ)句中的第一類,也就是選擇語(yǔ)句!
3.空語(yǔ)句
空語(yǔ)句是只有一個(gè)分號(hào)的語(yǔ)句,它在程序中什么也不做,可能就是起到一個(gè)占位作用。
; //空語(yǔ)句
for( int i=0; i<10; i++ )
; //循環(huán)體為空
4.復(fù)合語(yǔ)句
可以用花括號(hào){ }將一系列語(yǔ)句括起來(lái),使其大功能上相當(dāng)于一條語(yǔ)句,這就是語(yǔ)句塊。語(yǔ)句塊中可以有變量聲明,聲明必須位于塊的開始。
int x; int y; x = 6; { int z = 100; y = z/x; printf("%d \n", y); } //從大功能上看,{}里面的三條語(yǔ)句相當(dāng)于一條語(yǔ)句
知識(shí)點(diǎn)2-選擇結(jié)構(gòu)
2.1 if語(yǔ)句
Q1:什么是if語(yǔ)句?
A1:if語(yǔ)句提供一種二分支選擇的控制流程,它根據(jù)表達(dá)式的值來(lái)決定執(zhí)行兩個(gè)不同情況下的其中一個(gè)分支程序段。
1.if語(yǔ)句的單分支
單分支就是只有一個(gè)分支,當(dāng)給定的條件滿足時(shí),執(zhí)行一個(gè)語(yǔ)句1;當(dāng)條件不滿足時(shí),不進(jìn)行任何操作,因此只有語(yǔ)句1一種輸出,因此我稱之為單分支。
if(表達(dá)式)
語(yǔ)句1;//如果為真,執(zhí)行語(yǔ)句;否則不執(zhí)行
//C語(yǔ)言規(guī)定:0為假,非0為真
案例1:如果小于18歲,輸出未成年。
//該情況只有一個(gè)分支,即只有小于18這種情況輸出。 #include<stdio.h> int main() { int age=10; if(age<18) printf("未成年\n"); return 0; }
2.if語(yǔ)句的雙分支
雙分支就是有兩個(gè)分支,當(dāng)給定的條件滿足時(shí),執(zhí)行語(yǔ)句1;當(dāng)條件不滿足時(shí),執(zhí)行語(yǔ)句2。因此有2種不同的輸出,稱之為雙分支。
if(表達(dá)式)
語(yǔ)句1;//表達(dá)式為真,執(zhí)行語(yǔ)句1
else
語(yǔ)句2;//否則,執(zhí)行語(yǔ)句2
案例2:小于18打印未成年;否則打印成年。
//該情況只有兩個(gè)分支,即只有未成年、成年兩種不同的輸出結(jié)果 #include<stdio.h> int main() { int age=20; if(age<18)//年齡小于18時(shí)打印未成年 printf("未成年\n"); else//否則打印成年 printf("成年\n"); return 0; }//由于我們將age初始化為20,因此最終會(huì)選擇打印“成年”
3.if語(yǔ)句的多分支
多分支就是有多個(gè)分支,這邊使用else if來(lái)使得if語(yǔ)句也可以進(jìn)行多個(gè)分支的判斷,我們?cè)诔绦蛑兄灰ㄟ^增加else if,就可以增加if語(yǔ)句判斷的分支數(shù)。
如下例中,當(dāng)表達(dá)式1滿足執(zhí)行語(yǔ)句1;如果不滿足表達(dá)式1,滿足表達(dá)式2,執(zhí)行語(yǔ)句2;其余情況執(zhí)行語(yǔ)句3,有3種不同的分支,因此我們稱之為多分支。
if(表達(dá)式1)//表達(dá)式1為真,執(zhí)行語(yǔ)句1
語(yǔ)句1;
else if(表達(dá)式2)//表達(dá)式1為假,表達(dá)式2為真,執(zhí)行語(yǔ)句2
語(yǔ)句2;
else//其余所有情況,執(zhí)行語(yǔ)句3
語(yǔ)句3;
案例3:輸入年齡后,判斷一個(gè)人的年齡范圍并輸出其結(jié)果(共有5種可能:未成年、青年、壯年、老年、老不死)
//有5種不同的輸出,因此判斷為多分支,需要結(jié)合else if #include<stdio.h> int main() { int age=0; scanf("%d",&age); if(age<18) printf("未成年\n"); else if (18<=age && age<28) printf("青年\n"); else if(age>=50 && age<50) printf("壯年\n"); else if(age>=50 && age<90) printf("老年\n"); else//最后一個(gè)else也可以省略 printf("老不死"); return 0; }
4.if語(yǔ)句與代碼塊
如果條件成立,要執(zhí)行多條語(yǔ)句,應(yīng)該使用代碼塊{ }。
#include <stdio.h>
int main()
{
if(表達(dá)式)
{
語(yǔ)句列表1;//包含多條語(yǔ)句
}
else
{
語(yǔ)句列表2;//包含多條語(yǔ)句
}
return 0;
}
案例4:輸入年齡后,判斷一個(gè)人的年齡范圍并輸出其結(jié)果(共有5種可能:未成年、青年、壯年、老年、老不死)
#include<stdio.h> int main() { int age=10; if(age<18) //情況A(包含多條代碼,使用代碼塊) { printf("未成年\n"); printf("不能談戀愛\n"); }//一對(duì)大括號(hào),就是一個(gè)代碼塊 else //情況B(包含多條代碼,使用代碼塊) { if (18<=age && age<28) printf("青年\n"); else if(age>=50 && age<50) printf("壯年\n"); else if(age>=50 && age<90) printf("老年\n"); else//最后一個(gè)else也可以省略 printf("老頑童"); } return 0; }
5.懸空else
Q1:什么是懸空else?
A1:else是和它離的最近的if匹配的,我們可以看一看下面這道例題來(lái)深入了解。
#include<stdio.h> int main() { int a=0; int b=2; if(a==1) if(b==1) printf("hehe\n"); else printf("haha\n"); return 0; }
從程序的書寫形式上來(lái)看,if (a==1)
與 else printf("haha\n");
是匹配的,按這個(gè)邏輯,因?yàn)閍=0不滿足第一個(gè)if條件,因此會(huì)直接進(jìn)入else printf("haha\n");
,本題最終應(yīng)當(dāng)輸出haha,可真的如此嗎?
結(jié)果居然是什么都沒有輸出。這是因?yàn)閑lse是和離它最近if相匹配的,也就是與if(b==1)相匹配,因此上圖橙色方框圈起來(lái)的這幾行代碼都屬于if (a==1) 條件滿足的情況,而本題a初始化為0,不滿足a==1,因此就不會(huì)有任何輸出。
2.2switch語(yǔ)句
1.switch語(yǔ)句的定義
Q1:什么是switch語(yǔ)句?
A1:switch語(yǔ)句是一種專門進(jìn)行多分支選擇的分支控制語(yǔ)句。上面介紹了if語(yǔ)句使用else if可以實(shí)現(xiàn)多分支,但是具體實(shí)現(xiàn)起來(lái)程序冗長(zhǎng)且難以理解,而采用switch語(yǔ)句實(shí)現(xiàn)分支則結(jié)構(gòu)更清晰。switch語(yǔ)句的一般語(yǔ)法結(jié)構(gòu)如下:
switch(表達(dá)式)
{
case 常量表達(dá)式1:語(yǔ)句1;(break;)
case 常量表達(dá)式2:語(yǔ)句2;(break;)
···
case 常量表達(dá)式n:語(yǔ)句n;(break;)
default:語(yǔ)句n+1;
}
switch語(yǔ)句的執(zhí)行過程:
- 計(jì)算switch表達(dá)式的值。
- 將該值與case后面的常量表達(dá)式的值相比較,當(dāng)switch表達(dá)式的值與某個(gè)常量表達(dá)式i的值一致時(shí),就從該case后的語(yǔ)句i開始執(zhí)行,直到遇到break語(yǔ)句或整個(gè)switch結(jié)束。
- 若switch表達(dá)式與任何常量表達(dá)式的值均不同時(shí),則執(zhí)行default后面的語(yǔ)句或執(zhí)行switch結(jié)構(gòu)的后續(xù)語(yǔ)句。
上述switch結(jié)構(gòu)的幾點(diǎn)注意:
(1)switch 后面的圓括號(hào)內(nèi)的表達(dá)式類型一般為整型、字符型和枚舉型,不能為浮點(diǎn)型。
(2)case標(biāo)簽: case后必須跟整數(shù)類型(包括char類型)的常量或整型常量表達(dá)式。
Q2:case后為什么可以跟char類型?
A2:因?yàn)锳SCII字符在內(nèi)存中是以整型存儲(chǔ)的!
(3)break語(yǔ)句:它使程序控制跳出當(dāng)前循環(huán)或switch語(yǔ)句的剩余部分,它實(shí)際效果是把語(yǔ)句列表劃分為不同的分支部分。
(4)default子句:當(dāng) switch表達(dá)式的值并不匹配所有case標(biāo)簽的值時(shí),這個(gè)default 子句后面的語(yǔ)句就會(huì)執(zhí)行。所以,每個(gè)switch語(yǔ)句中只能出現(xiàn)一條default子句。
2.switch語(yǔ)句的實(shí)戰(zhàn)案例
案例1.0 選擇打印星期
//該程序在接收到整數(shù)1-7后,會(huì)打印相對(duì)應(yīng)星期,然后運(yùn)行到break,跳出switch語(yǔ)句 #include<stdio.h> int main() { int day = 0; scanf("%d", &day); switch (day)//day必須定義為整型 { case 1+0 :printf("星期1\n");break;//case1+0 √ case后跟整型常量就行 case 2:printf("星期2\n");break; case 3:printf("星期3\n");break; case 4:printf("星期4\n");break; case 5:printf("星期5\n");break; case 6:printf("星期6\n");break; case 7:printf("星期7\n");break; } return 0; }
案例1.1 改進(jìn)打印星期
題目變化:輸入1-5打印工作日;輸入6-7打印休息日.
巧妙利用case語(yǔ)句未遇到break程序會(huì)持續(xù)進(jìn)行,因此無(wú)論從case1進(jìn)入還是從case5進(jìn)入,最終都會(huì)在printf("工作日")下一行的break結(jié)束switch語(yǔ)句;case6&case7同理。
案例2.0:求求看最后m與n的值為多少?
#include<stdio.h> int main() { int n = 1; int m = 2; switch (n) { case 1:m++; case 2:n++; case 3: switch (n) { case 1:n++; case 2:m++; n++; break; } case 4:m++; default: break; } printf("m=%d , n=%d \n", m, n); return 0; }
這一題的細(xì)節(jié)主要在于理解switch的嵌套,我們一步一步分析:
- 進(jìn)入case1,m++,m變?yōu)?。
- 進(jìn)入case2,n++,n變?yōu)?。
- 進(jìn)入case3,這里嵌套了一個(gè)子switch語(yǔ)句,由于此時(shí)n為2,因此進(jìn)入子case2,m++,n++,遇到break跳出子switch語(yǔ)句,此時(shí)m為4,n為3。
- 進(jìn)入case4,m++,m變?yōu)?,由于沒有遇到break繼續(xù)向下執(zhí)行。
- 遇到default中的break,結(jié)束switch語(yǔ)句,打印結(jié)果,此時(shí)m=5,n=3。
到此這篇關(guān)于C語(yǔ)言深入講解語(yǔ)句與選擇結(jié)構(gòu)的使用的文章就介紹到這了,更多相關(guān)C語(yǔ)言語(yǔ)句與選擇結(jié)構(gòu)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Qt數(shù)據(jù)庫(kù)應(yīng)用之實(shí)現(xiàn)通用數(shù)據(jù)庫(kù)清理
項(xiàng)目如果需要存儲(chǔ)很多日志記錄比如運(yùn)行日志,時(shí)間長(zhǎng)了記錄數(shù)量非常多,數(shù)據(jù)庫(kù)體積不斷增大,對(duì)應(yīng)數(shù)據(jù)庫(kù)表的增刪改查的效率不斷降低,因此需要將早期的數(shù)據(jù)清理。本文將詳細(xì)介紹一下通用數(shù)據(jù)庫(kù)清理的實(shí)現(xiàn),需要的可以參考一下2022-02-02wxWidgets實(shí)現(xiàn)無(wú)標(biāo)題欄窗口拖動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了wxWidgets實(shí)現(xiàn)無(wú)標(biāo)題欄窗口拖動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02C++ inline內(nèi)聯(lián)函數(shù)詳解
這篇文章主要介紹了C++ inline內(nèi)聯(lián)函數(shù)詳解,有感興趣的同學(xué)可以借鑒參考下2021-02-02VC++實(shí)現(xiàn)通過API來(lái)查看程序錯(cuò)誤信息的方法
這篇文章主要介紹了VC++實(shí)現(xiàn)通過API來(lái)查看程序錯(cuò)誤信息的方法,非常實(shí)用的功能,需要的朋友可以參考下2014-08-08