☛ 條件式的真假

C++ 的條件判斷別式其實就是一個運算式,而所謂條件的真假就是以此算式的運算結果來判別。 不管是何種運算式,當運算結果為非 0 的值時,表示條件為真;當運算結果為 0 時,表示條件為假。 如:

a && b 當 a 與 b 都是真 ( 非 0 的值 ),則結果為真。
a == b 當 a 與 b 相等時,則結果為真。 ( 與下例不同 )
a = b 當 a 的值為真 ( 非 0 的值 ),則結果為真。
a * b a 與 b 之積為真 ( 非 0 的值 ),則結果為真。
c = func(i) func(i) 傳回給 c 的值為真,則結果為真。

 

請特別注意! 條件算式若含有等號時,則以運算后等號左邊的變數值為其真假值。 所以有一些陷阱必須注意,如:

if(a==0)     // 判斷 a 是否為 0
  { 動作 }

當 a 的值等於 0,則執行 { } 內的動作。

if(a=0)       // a 的值被設定為 0 ( 假 )
  { 動作 }

{ } 內的動作永遠不會被執行。

對於條件式里使用的是 ‘=’ 或是 ‘==’ 就要特別的小心。 使用 “=” 的方便之處是一方面可以運算、設定,另一方面又可以用來判斷,但卻易產生誤解。

☛ 條件判斷:if-else

if 指令:

if 是最常用的條件判斷指令,其格式為:

if(條件式)
  { 動作 }

執行 if 敘述時,若條件式為真,則執行 { } 內的動作,若條件式不成立,則略過該動作而繼續往下執行。 例如:

#include<iostream.h>
#include<conio.h>
.......
c=getch();
if(c=='q')
   cout<<"Good-Bye!";
.......

getch() 是標準函式庫內提供的函式,可由鍵盤讀取一個字元作為傳回值,其原型宣告是放在標頭檔 conio.h 中,所以我們在使用之前必須要 include 這個檔。 當 getch() 取到的是 ‘q’ 時,則印出 Good-Bye!,否則略過而往下執行。

☛ if-else 指令

if 是對某一動作做選擇。 如果我們想對兩種動作做選擇,則可以使用 if-else :

if(條件式)
  { 動作 1 }     //條件式成立時,執行動作 1
else
  { 動作 2 }     //否則,執行動作 2

這個敘述是說,當條件式成立時,則執行動作 1,然後略過 else 的部分 ( 動作 2 ),接著往下執行。 當條件式不成立時,則略過 if 的部分 ( 動作 1 ) 而執行 else 的動作 2,然後再往下執行。 也就是說,動作 1 與動作 2 只會因條件式的真假由二者選一來執行。

下面是一個 if-else 的使用例子:

if(getch()=='q')
   retuen;
else
   cout<<"Continue....";

☛ 巢狀的 if-else

if-else 的動作部分可以是任何合法的敘述,所以也可以是另一個 if-else。 也就是說我們可以在 if-else 中再插入 if-else,或者說把 if 或 else 的動作部分以另一組 if-else 來取代。 這就是所謂 if-else 的變形。 首先我們來看這種情況:

if(a>0)
   if(b>0)
      cout<<"a>0 and b>0";
   else
      cout<<"a>0 and b<=0";
else
   if(b>0)
      cout<<"a<=0 and b>0";
   else
      cout<<"a<=0 and b<=0";

這種寫法是以 if-else 來取代原來 if 或 else 的動作部分,通常稱為「巢狀的 if-else」。 這是最容易引起誤解的寫法,我們要掌握的閱讀原則是 else 要與最接近且未配對的 if 配成一對。 這種寫法也可能產生變形,比如 if 比 else 還多的情況,但我們的原則還是以最接近的 if 來與 else 來配對。 if-else 的關係會被區塊 { } 中止,所以上述的 if-else 配對規則只限於同一區塊內部。

if(a>0)
   if(b>0)
      cout<<"a>0 and b>0";
else
   cout<<"a<=0";

上述的寫法乍看之下,else 好像與第一個 if 配對,但事實上卻是與第二個 if 配對 ( 與最近且未配對的 if 配對 )。 因此,我們應加上一個 { } 以使 else 與第一個 if 配對:

if(a>0)
{
   if(b>0)
      cout<<"a>0 and b>0";
}
else
   cout<<"a<=0";

另外一種連續判斷式的 if-else 是:

if(條件式 1)
  { 動作 A }          //條件式 1 成立時
else if(條件式 2)
  { 動作 B }          //條件式 2 成立時
else if(條件式 3)
  { 動作 C }          //條件式 3 成立時
else
  { 動作 D }          //其它

這種寫法是以 if-else 來取代原來的 else 動作部分,這是所謂過濾式或多重選擇式的寫法。 以所得稅計算為例,其稅率是依照年收入 ( income ) 的多寡而有所不同:

if(income>5000000)
   tax=income*0.20;
else if(income>1000000)
   tax=income*0.15;
else if(income>300000)
   tax=income*0.10;
else if(income>150000)
   tax=income*0.05;
else
   tax=0;

我們也可以把這種寫法看成是把els-if當成一個整體指令,而插入到if-else之間,每插入一組else-if就引入一組條件。

※ 注意事項

使用 if else 敘述有下列幾點要小心:

⑴ if 與 else 敘述的動作部分最後要記得加分號 ‘;’。 如:

if(a>b)
   max=a;
else
   max=b;

⑵ 若有多個 if else 比較時,這些 if else 可以寫成鋸齒狀的表示式,使程式可讀性提高,這時最好每個 if 都能對應一個 else,否則應該要加上 { } 以免出錯。

if(a>0)
{
   if(b>0)
      if(c>0)
         cout<<"a,b,c all > 0";
      else
         cout<<"a,b>0 and c<=0";
}
else
    cout<<"a<=0";

⑶ else 會與最近的 if 配對,除非我們以 { } 來加以區隔。 下例中若不加 { },則 else 會與第二個 if 配對:

if(n>0)
{
   if(a>b)
      max=a;
}
else
    max=b;

⑷ 其實 if 的條件式不一定要是一個運算式,也可以是一個變數 ( 記得,單一變數也是合法的算式 ),所以 if(a!=0) 也可以寫成 if(a),若 a=0 為假,否則為真。