C語言深入講解語句與選擇結(jié)構(gòu)的使用
知識點1-語句
1.1 語句
1.表達式語句
由一個表達式加分號構(gòu)成一個表達式語句,其一般形式如下:
表達式 ;
Q1:什么是表達式?
A1:表達式就是C語言中由運算符和數(shù)據(jù)構(gòu)成的式子;表達式運算的結(jié)果稱為表達式的值,以下都是一些常見的表達式。
//表達式
1
-5
4+20
x = q++ % 3
a*(b + c/d)/20
q > 3
kiko:因此表達式語句就是在上面這些表達式后面加一個分號就完事了~
//表達式語句
1;
-5;
4+20;
x = q++ % 3 ;
a*(b + c/d)/20 ;
q > 3;
2.控制語句
由名字可見,控制語句用于控制程序的執(zhí)行過程,它是由特定的語句定義的,我個人將C語言中的控制語句分為以下3類:
- 選擇語句:if-else語句、switch-case語句。
- 循環(huán)語句:while語句、do-while語句、break語句。
- 跳轉(zhuǎn)語句:break語句、goto語句、continue語句。
本期我們就講三類語句中的第一類,也就是選擇語句!
3.空語句
空語句是只有一個分號的語句,它在程序中什么也不做,可能就是起到一個占位作用。
; //空語句
for( int i=0; i<10; i++ )
; //循環(huán)體為空
4.復(fù)合語句
可以用花括號{ }將一系列語句括起來,使其大功能上相當于一條語句,這就是語句塊。語句塊中可以有變量聲明,聲明必須位于塊的開始。
int x;
int y;
x = 6;
{ int z = 100;
y = z/x;
printf("%d \n", y);
} //從大功能上看,{}里面的三條語句相當于一條語句知識點2-選擇結(jié)構(gòu)
2.1 if語句
Q1:什么是if語句?
A1:if語句提供一種二分支選擇的控制流程,它根據(jù)表達式的值來決定執(zhí)行兩個不同情況下的其中一個分支程序段。
1.if語句的單分支
單分支就是只有一個分支,當給定的條件滿足時,執(zhí)行一個語句1;當條件不滿足時,不進行任何操作,因此只有語句1一種輸出,因此我稱之為單分支。
if(表達式)
語句1;//如果為真,執(zhí)行語句;否則不執(zhí)行
//C語言規(guī)定:0為假,非0為真
案例1:如果小于18歲,輸出未成年。
//該情況只有一個分支,即只有小于18這種情況輸出。
#include<stdio.h>
int main()
{
int age=10;
if(age<18)
printf("未成年\n");
return 0;
}
2.if語句的雙分支
雙分支就是有兩個分支,當給定的條件滿足時,執(zhí)行語句1;當條件不滿足時,執(zhí)行語句2。因此有2種不同的輸出,稱之為雙分支。
if(表達式)
語句1;//表達式為真,執(zhí)行語句1
else
語句2;//否則,執(zhí)行語句2
案例2:小于18打印未成年;否則打印成年。
//該情況只有兩個分支,即只有未成年、成年兩種不同的輸出結(jié)果
#include<stdio.h>
int main()
{
int age=20;
if(age<18)//年齡小于18時打印未成年
printf("未成年\n");
else//否則打印成年
printf("成年\n");
return 0;
}//由于我們將age初始化為20,因此最終會選擇打印“成年”
3.if語句的多分支
多分支就是有多個分支,這邊使用else if來使得if語句也可以進行多個分支的判斷,我們在程序中只要通過增加else if,就可以增加if語句判斷的分支數(shù)。
如下例中,當表達式1滿足執(zhí)行語句1;如果不滿足表達式1,滿足表達式2,執(zhí)行語句2;其余情況執(zhí)行語句3,有3種不同的分支,因此我們稱之為多分支。
if(表達式1)//表達式1為真,執(zhí)行語句1
語句1;
else if(表達式2)//表達式1為假,表達式2為真,執(zhí)行語句2
語句2;
else//其余所有情況,執(zhí)行語句3
語句3;
案例3:輸入年齡后,判斷一個人的年齡范圍并輸出其結(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//最后一個else也可以省略
printf("老不死");
return 0;
}
4.if語句與代碼塊
如果條件成立,要執(zhí)行多條語句,應(yīng)該使用代碼塊{ }。
#include <stdio.h>
int main()
{
if(表達式)
{
語句列表1;//包含多條語句
}
else
{
語句列表2;//包含多條語句
}
return 0;
}
案例4:輸入年齡后,判斷一個人的年齡范圍并輸出其結(jié)果(共有5種可能:未成年、青年、壯年、老年、老不死)
#include<stdio.h>
int main()
{
int age=10;
if(age<18) //情況A(包含多條代碼,使用代碼塊)
{
printf("未成年\n");
printf("不能談戀愛\n");
}//一對大括號,就是一個代碼塊
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//最后一個else也可以省略
printf("老頑童");
}
return 0;
}5.懸空else
Q1:什么是懸空else?
A1:else是和它離的最近的if匹配的,我們可以看一看下面這道例題來深入了解。
#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;
}從程序的書寫形式上來看,if (a==1) 與 else printf("haha\n"); 是匹配的,按這個邏輯,因為a=0不滿足第一個if條件,因此會直接進入else printf("haha\n");,本題最終應(yīng)當輸出haha,可真的如此嗎?

結(jié)果居然是什么都沒有輸出。這是因為else是和離它最近if相匹配的,也就是與if(b==1)相匹配,因此上圖橙色方框圈起來的這幾行代碼都屬于if (a==1) 條件滿足的情況,而本題a初始化為0,不滿足a==1,因此就不會有任何輸出。
2.2switch語句
1.switch語句的定義
Q1:什么是switch語句?
A1:switch語句是一種專門進行多分支選擇的分支控制語句。上面介紹了if語句使用else if可以實現(xiàn)多分支,但是具體實現(xiàn)起來程序冗長且難以理解,而采用switch語句實現(xiàn)分支則結(jié)構(gòu)更清晰。switch語句的一般語法結(jié)構(gòu)如下:
switch(表達式)
{
case 常量表達式1:語句1;(break;)
case 常量表達式2:語句2;(break;)
···
case 常量表達式n:語句n;(break;)
default:語句n+1;
}
switch語句的執(zhí)行過程:
- 計算switch表達式的值。
- 將該值與case后面的常量表達式的值相比較,當switch表達式的值與某個常量表達式i的值一致時,就從該case后的語句i開始執(zhí)行,直到遇到break語句或整個switch結(jié)束。
- 若switch表達式與任何常量表達式的值均不同時,則執(zhí)行default后面的語句或執(zhí)行switch結(jié)構(gòu)的后續(xù)語句。
上述switch結(jié)構(gòu)的幾點注意:
(1)switch 后面的圓括號內(nèi)的表達式類型一般為整型、字符型和枚舉型,不能為浮點型。
(2)case標簽: case后必須跟整數(shù)類型(包括char類型)的常量或整型常量表達式。

Q2:case后為什么可以跟char類型?
A2:因為ASCII字符在內(nèi)存中是以整型存儲的!

(3)break語句:它使程序控制跳出當前循環(huán)或switch語句的剩余部分,它實際效果是把語句列表劃分為不同的分支部分。

(4)default子句:當 switch表達式的值并不匹配所有case標簽的值時,這個default 子句后面的語句就會執(zhí)行。所以,每個switch語句中只能出現(xiàn)一條default子句。

2.switch語句的實戰(zhàn)案例
案例1.0 選擇打印星期
//該程序在接收到整數(shù)1-7后,會打印相對應(yīng)星期,然后運行到break,跳出switch語句
#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 改進打印星期
題目變化:輸入1-5打印工作日;輸入6-7打印休息日.
巧妙利用case語句未遇到break程序會持續(xù)進行,因此無論從case1進入還是從case5進入,最終都會在printf("工作日")下一行的break結(jié)束switch語句;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;
}這一題的細節(jié)主要在于理解switch的嵌套,我們一步一步分析:
- 進入case1,m++,m變?yōu)?。
- 進入case2,n++,n變?yōu)?。
- 進入case3,這里嵌套了一個子switch語句,由于此時n為2,因此進入子case2,m++,n++,遇到break跳出子switch語句,此時m為4,n為3。
- 進入case4,m++,m變?yōu)?,由于沒有遇到break繼續(xù)向下執(zhí)行。
- 遇到default中的break,結(jié)束switch語句,打印結(jié)果,此時m=5,n=3。

到此這篇關(guān)于C語言深入講解語句與選擇結(jié)構(gòu)的使用的文章就介紹到這了,更多相關(guān)C語言語句與選擇結(jié)構(gòu)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言實現(xiàn) 數(shù)據(jù)類型占多少字節(jié)指針占多少字節(jié)
這篇文章主要介紹了 C語言 數(shù)據(jù)類型占多少字節(jié)指針占多少字節(jié)的實例代碼,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-09-09

