選擇

在此介紹條件選擇執行程式碼的語法,從ifif-elseswitch-case,除了一一介紹這三種之外,還要另外講解它們提高可讀性的做法,以及幫助除錯的注意事項。

if

如上圖

  • 藍色線: 「if(運算式)的運算式」成立,執行//運算式的運算式

  • 綠色線: 「if(運算式)的運算式」不成立,跳過大括號裡的程式碼不執行,繼續執行大括號以下的程式碼。

在某些時間點,程式設計師會選擇是否要執行某些程式碼;換句話說,「只要條件成立,就執行程式碼。」 (如果要選擇是否要編譯某些程式碼,則稱之為條件編譯)

語法定義

if(運算式)
    一行程式碼

或者程式碼很多時,要加上括號代表,這些都是一起的。

if(運算式)
{
    很多程式碼
}

if的運算式

剛剛說到條件成立,在此來討論什麼叫「條件成立」。

  • 成立:運算式結果 非零true

  • 不成立:運算式結果 為0false

運算式它可以是邏輯運算(回傳true/false),也可以是算術運算(回傳數字),也可以使用函數的回傳值(回傳true/false/傳數字)。

注意:在此指的數字包含整數浮點數,因為兩種的情況有些資料型別上的細節要注意,我們放在變數的章節講。

範例程式

下面的範例程式碼,會把一段conversation印在螢幕上,IsChrisAnswer決定Chris是否要回Mary的話。

bool IsChrisAnswer = false;

cout << "Mary: What is your name?" << endl;

if (IsChrisAnswer)
    cout << "Chris: I am Chris." << endl;

if (!IsChrisAnswer)
    cout << "Mary: Why do not you answer me? << endl;

return 0;

最常遇到的不確定情況

下面程式是否會回答I am Chris.

cout << "Mary: What's your name?" << endl;

if (5+2)
    cout << "Chris: I am Chris." << endl;

return 0;

很多的if

下面我們介紹一下同時出現很if時,增加可讀性的做法 這是一個可讀性不高的例子。

bool Display = false;
bool Show = false;
bool Enable = false;

//...
if (Display)
    if (Show)
        if (Enable)
        {
            cout << "Display this code" << endl;
            //...
        }

return 0;

縮成一行條件

遇到這種很深的if,而沒有else時,表示即將要執行的程式碼,是一種非常非常特例的程式,必須要符合眾多的條件才可以執行。

那麼,我們就把它的條件,通通用AND連結起來,範例如下

bool Display = false;
bool Show = false;
bool Enable = false;

//...
if (Display && Show && Enable) //用AND連起來的條件
{
    cout << "Display this code" << endl;
    //...
}

return 0;

其實,這段程式碼的意思,就是這樣。要所有的條件通通的符合時,才執行。但是有時這麼寫會成條件描述的可讀性 降低太多,就算把它們都裝成獨立概念的function還是過於複雜,我們可以試試第二種做法。

解散過深的巢狀式結構

遇到必須符合很多條件才可以執行的程式碼,其實另一個語意就是說這些條件只要不符合,就不用執行該行了。

bool Display = false;
bool Show = false;
bool Enable = false;

//...
if (!Display)   return 0;
if (!Show)      return 0;
if (!Enable)    return 0;

cout << "Display this code" << endl;
//...

return 0;

這樣的語意,對於條件的可讀性,就會強調許多。每一個條件只要不成立,就不執行程式。

if(a == 3)寫成if(a = 3)的bug

我們另外寫個小程式來說明這件事

#include <iostream>

int main()
{
    int a = 3;

    if(a == 3)
        cout << "a == 3" << endl;
}

這是一個非常有價值的bug,《Expert C Programming Deep C Secrets》一書開門見山就提到了這個bug,會造成嚴重損失又非常的難以偵錯。而在《Writing Solid Code》中提及了如何避免這種情況發生。

雖然這兩本都是介紹C語言的書,由於C++的相容性,C語言的程式技巧依然在C++是可行的。

編譯器允許們這麼寫

if(a == 3)
if(a = 3)

編譯器不允許我們這麼寫

if(3 = a)

不過,編譯器卻允許我們這麼寫

if(3 == a)

=是賦值,寫==是偵測是否相等。賦值的原則,必須將右邊的值移到左邊來,而偵測是否相等,則不強制要求左右各是誰。這麼樣就可以避免把==誤寫成=的錯誤,造成complier沒問題,linker沒問題,執行卻出了大問題。

Last updated

Was this helpful?