C語言深入講解語句與選擇結構的使用

知識點1-語句

1.1 語句

1.表達式語句

由一個表達式加分號構成一個表達式語句,其一般形式如下:

表達式 ;

Q1:什麼是表達式?

A1:表達式就是C語言中由運算符和數據構成的式子;表達式運算的結果稱為表達式的值,以下都是一些常見的表達式。

//表達式
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.控制語句

由名字可見,控制語句用於控制程序的執行過程,它是由特定的語句定義的,我個人將C語言中的控制語句分為以下3類:

  • 選擇語句:if-else語句、switch-case語句。
  • 循環語句:while語句、do-while語句、break語句。
  • 跳轉語句:break語句、goto語句、continue語句。

本期我們就講三類語句中的第一類,也就是選擇語句!

3.空語句

空語句是隻有一個分號的語句,它在程序中什麼也不做,可能就是起到一個占位作用。

; //空語句
for( int i=0; i<10; i++ )
; //循環體為空

4.復合語句

可以用花括號{ }將一系列語句括起來,使其大功能上相當於一條語句,這就是語句塊。語句塊中可以有變量聲明,聲明必須位於塊的開始。

int x;
int y;
x = 6;
{   int z = 100;
    y = z/x;
    printf("%d \n", y);  
}   //從大功能上看,{}裡面的三條語句相當於一條語句

知識點2-選擇結構

2.1 if語句

Q1:什麼是if語句?

A1:if語句提供一種二分支選擇的控制流程,它根據表達式的值來決定執行兩個不同情況下的其中一個分支程序段。

1.if語句的單分支

單分支就是隻有一個分支,當給定的條件滿足時,執行一個語句1;當條件不滿足時,不進行任何操作,因此隻有語句1一種輸出,因此我稱之為單分支。

if(表達式)
語句1;//如果為真,執行語句;否則不執行
//C語言規定:0為假,非0為真

案例1:如果小於18歲,輸出未成年。

//該情況隻有一個分支,即隻有小於18這種情況輸出。
#include<stdio.h>
int main()
{
    int age=10;
    if(age<18)
     printf("未成年\n");
     return 0;
}

2.if語句的雙分支

雙分支就是有兩個分支,當給定的條件滿足時,執行語句1;當條件不滿足時,執行語句2。因此有2種不同的輸出,稱之為雙分支。

if(表達式)
語句1;//表達式為真,執行語句1
else
語句2;//否則,執行語句2

案例2:小於18打印未成年;否則打印成年。

//該情況隻有兩個分支,即隻有未成年、成年兩種不同的輸出結果
#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語句判斷的分支數。

如下例中,當表達式1滿足執行語句1;如果不滿足表達式1,滿足表達式2,執行語句2;其餘情況執行語句3,有3種不同的分支,因此我們稱之為多分支。

if(表達式1)//表達式1為真,執行語句1
語句1;
else if(表達式2)//表達式1為假,表達式2為真,執行語句2
語句2;
else//其餘所有情況,執行語句3
語句3;

案例3:輸入年齡後,判斷一個人的年齡范圍並輸出其結果(共有5種可能:未成年、青年、壯年、老年、老不死)

//有5種不同的輸出,因此判斷為多分支,需要結合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語句與代碼塊

如果條件成立,要執行多條語句,應該使用代碼塊{ }。

#include <stdio.h>
int main()
{
    if(表達式)
   {
        語句列表1;//包含多條語句
   }
    else
   {
        語句列表2;//包含多條語句
   }
    return 0; 
}

案例4:輸入年齡後,判斷一個人的年齡范圍並輸出其結果(共有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");,本題最終應當輸出haha,可真的如此嗎?

結果居然是什麼都沒有輸出。這是因為else是和離它最近if相匹配的,也就是與if(b==1)相匹配,因此上圖橙色方框圈起來的這幾行代碼都屬於if (a==1) 條件滿足的情況,而本題a初始化為0,不滿足a==1,因此就不會有任何輸出。

2.2switch語句

1.switch語句的定義

Q1:什麼是switch語句?

A1:switch語句是一種專門進行多分支選擇的分支控制語句。上面介紹瞭if語句使用else if可以實現多分支,但是具體實現起來程序冗長且難以理解,而采用switch語句實現分支則結構更清晰。switch語句的一般語法結構如下:

switch(表達式)
{
case 常量表達式1:語句1;(break;)
case 常量表達式2:語句2;(break;)
···
case 常量表達式n:語句n;(break;)
default:語句n+1;
}

switch語句的執行過程:

  • 計算switch表達式的值。
  • 將該值與case後面的常量表達式的值相比較,當switch表達式的值與某個常量表達式i的值一致時,就從該case後的語句i開始執行,直到遇到break語句或整個switch結束。
  • 若switch表達式與任何常量表達式的值均不同時,則執行default後面的語句或執行switch結構的後續語句。

上述switch結構的幾點註意:

(1)switch 後面的圓括號內的表達式類型一般為整型、字符型和枚舉型,不能為浮點型。

(2)case標簽: case後必須跟整數類型(包括char類型)的常量或整型常量表達式。

Q2:case後為什麼可以跟char類型?

A2:因為ASCII字符在內存中是以整型存儲的!

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

(4)default子句:當 switch表達式的值並不匹配所有case標簽的值時,這個default 子句後面的語句就會執行。所以,每個switch語句中隻能出現一條default子句。

2.switch語句的實戰案例

案例1.0 選擇打印星期

//該程序在接收到整數1-7後,會打印相對應星期,然後運行到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程序會持續進行,因此無論從case1進入還是從case5進入,最終都會在printf("工作日")下一行的break結束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;
}

這一題的細節主要在於理解switch的嵌套,我們一步一步分析:

  • 進入case1,m++,m變為3。
  • 進入case2,n++,n變為2。
  • 進入case3,這裡嵌套瞭一個子switch語句,由於此時n為2,因此進入子case2,m++,n++,遇到break跳出子switch語句,此時m為4,n為3。
  • 進入case4,m++,m變為5,由於沒有遇到break繼續向下執行。
  • 遇到default中的break,結束switch語句,打印結果,此時m=5,n=3。

到此這篇關於C語言深入講解語句與選擇結構的使用的文章就介紹到這瞭,更多相關C語言語句與選擇結構內容請搜索LevelAH以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持LevelAH!

推薦閱讀: