1. 程式人生 > >C之分支語句(六)

C之分支語句(六)

C語言 if 選擇語句 switch 選擇語句

我們在日常生活中難免會遇到要做選擇的情況,那麽在 C 語言中也有做選擇的情況。在這種情況下,我們的代碼又該怎樣寫呢?這時就可以用到我們的分支語句了。 總體來說,我們在 C 語言中可以經常看到兩種分支語句:第一種 if 分支語句,第二章就是 switch 分支語句了。我們先來介紹第一種分支語句,if 分支語句。

if 語句用於根據條件選擇執行的語句,那麽這時對應的 else 不能獨立存在且總是與它最近的 if 相匹配,else 語句後可以接連其他 if 語句,用法如下:

技術分享圖片

那麽在 if 語句中做零值比較的話,我們得註意幾點問題:1、bool 型變量應該直接出現於條件中,不要進行比較;2、變量和 0 值進行比較時,0 值應該出現在比較符號左邊;3、float 型變量不能直接進行 0 值比較,需要定義精度。

因為我們知道 float 型變量是不精確的,所以不能直接進行比較。為了更加形象的說明,我們總結如下:

技術分享圖片

下來我們做個示例對 if 語句進行說明,代碼如下:

#include <stdio.h>

void f1(int i)
{
    if( i < 6 )
    {
        printf("Failed!\n");
    }
    else if( (6 <= i) && (i <= 8) )
    {
        printf("Good!\n");
    }
    else
    {
        printf("Perfect!\n");
    }
}

void f2(char i)
{
    if( 'c' == i )
    {
        printf("Compile\n");
    }
    else if( 'd' == i )
    {
        printf("Debug\n");
    }
    else if( 'o' == i )
    {
        printf("Object\n");
    }
    else if( 'r' == i )
    {
        printf("Run\n");
    }
    else
    {
        printf("Unknown\n");
    }
}

int main()
{
    f1(5);        // Failed!
    f1(7);        // Good!
    f1(9);        // Perfect!
    
    f2('o');      // Object
    f2('d');      // Debug
    f2('e');      // Unknown
       
    return 0;
}

根絕我們之前的分析,打印出來的結果應該和我們分析的一樣,我們編譯運行下,得到結果如下:

技術分享圖片

那麽我們看到打印的結果和我們分析的是一致的,那麽大家可能對 f2(char i) 函數有疑問,裏面為什麽要寫成 'c' == i 呢?在這塊我們要寫成 i == 'c' 的話也沒有錯,我們編譯運行下結果也是對的。那麽為什麽要那樣寫呢?根據我們的工程經驗來說,一般新手在寫 == 時有時會寫成 =。如果我們是這樣寫 'c' = i 的話,編譯的時候就直接報錯,那麽我們在這時便會很快定位出問題。但是我們要寫成 i = 'c'

,編譯照樣還是通過的,但結果就不對了。對於新手來說,錯誤很難排查。我們分別編譯下兩種情況,看看輸出的是什麽?圖一是 'c' = i 這種情況,圖二是 i = 'c' 這種情況。

技術分享圖片

圖一

技術分享圖片

圖二


那麽我們可以看到第二種情況下,編譯可以通過,但結果是錯的,為什麽會輸出那樣的結果呢?我們再來分析下源代碼,無論你輸進去的是什麽字母,if( i = 'c' ) 這句代碼一直為真,因為它是賦值。所以就一直會打印出 Compile,這樣的錯誤對於我們新手來說是不容易排查的。所以建議大家以後寫 這種代碼時還是遵照規範的格式來寫,以最大程度避免錯誤。

接下來我們再來講講 switch 分支語句。switch 語句對應單個條件分值的情形;case 語句分支必須要有 break,否則會導致分支重疊;default 語句有必要加上,用以處理特殊情況。我們用如下圖來表示關系:

技術分享圖片

那麽在 case 語句中的值只能是×××或字符型;case 語句的排列是由順序的:1、按字母或數字順序排列各條語句;2、正常情況放在前面,異常情況放在後面;3、default 語句只用於處理真正的默認情況。

那麽我們在學習了兩種選擇語句之後,我們可以用 switch 語句對前面我們寫的 if 語句進行改寫,f1(int i) 和 f2(char i)代碼如下:

void f1(int i)
{
    switch( i < 6 )
    {
        case 1:
            printf("Failed!\n");
            break;
        default:
            switch( (6 <= i) && (i <= 8) )
            {
                case 1:
                    printf("Good!\n");
                    break;
                default:
                    printf("Perfect!\n");
                    break;
            }
    }
}

void f2(char i)
{
    switch( i )
    {
        case 'c':
            printf("Compile\n");
            break;
        case 'd':
            printf("Debug\n");
            break;
        case 'o':
            printf("Object\n");
            break;
        case 'r':
            printf("Run\n");
            break;
        default:
            printf("Unknown\n");
            break;
    }
}

我們再次進行編譯,得到結果如下:

技術分享圖片

我們自己對比前後兩次代碼,那種寫法更加合適,就需要我們自己來選擇了。C 語言之所以有提供兩種選擇語句,就是為了我們用戶的自主選擇性,在合適的地方用合適的代碼。我們可以看到,兩種代碼都是可以互換的。也就是說同樣的功能用 if 語句和 switch 語句都可以實現,這就需要我們自己來選擇用哪種方法了。

我們今天學習了 if 語句和 switch 語句,總結如下:1、if 語句適用於復雜邏輯進行判斷的情形中;2、switch 語句適用於對離散值進行判斷的情形中;3、if 語句和 switch 語句在功能上可以互換;4、if 語句對於“按片”分支判斷的情形更加簡潔;5、switch 語句對於多分支判斷的情形更加簡潔。後面我們會繼續對 C 語言的學習。


歡迎大家一起來學習 C 語言,可以加我QQ:243343083


C之分支語句(六)