關係運算、條件運算


數學上有比較的運算,像是大於、等於、小於等,C 中也提供了這些運算子,這些運算子稱為關係運算子(Relational operator)或比較運算子(Comparison operator),它們有大於(>)、不小於(>=)、小於(<)、不大於(<=)、等於 (==)以及不等於(!=)。

請看看下面這幾行會顯示哪些數值:

printf("10 > 5\t\t%d\n", 10 > 5);
printf("10 >= 5\t\t%d\n", 10 >= 5);
printf("10 < 5\t\t%d\n", 10 < 5);
printf("10 <= 5\t\t%d\n", 10 <= 5);
printf("10 == 5\t\t%d\n", 10 == 5);
printf("10 != 5\t\t%d\n", 10 != 5);

程式的執行會顯示 0 或 1,分別表示真(成立)或假(不成立),如下所示:

10 > 5          1
10 >= 5         1
10 < 5          0
10 <= 5         0
10 == 5         0
10 != 5         1

在 C 中,所有非零的數值在作為條件式時都被視為真。

關係運算在使用時有個即使是程式設計老手也可能犯的錯誤,且不容易發現,也就是等於運算子(==),注意它是兩個連續的等號(=)所組成,而不是一個等號,一個等號是指定運算子,這點必須相當注意,例如若有兩個變數 xy 要比較是否相等,是寫成 x == y,而不是 x = y,後者的作用是將 y 的值指定給 x,而不是比較運算。

既然談到了條件式的問題,我們來介紹 C 中的條件運算子(Conditional operator),它的使用方式如下:

條件式 ? 成立傳回值 : 失敗傳回值

條件運算子的傳回值依條件式的結果而定,如果條件式的結果為真,則傳回冒號前的值,若為假,則傳回冒號後的值,下面這個程式可以作個簡單的示範:

#include <stdio.h>

int main(void) {
    int score = 0;

    printf("輸入學生分數:");
    scanf("%d", &score);

    printf("該生是否及格?%c\n", score >= 60 ? 'Y' : 'N');

    return 0;
}

執行結果:

輸入學生分數:59
該生是否及格?N

這個程式會依你所輸入的分數來判斷學生成績是否不小於 60 分,以決定其是否及格,如果是則傳回字元 'Y',否則傳回字元 'N',下面這個程式可以判斷使用者輸入是否為奇數:

#include <stdio.h>

int main(void) {
    int input = 0;

    printf("輸入整數:");
    scanf("%d", &input);

    printf("該數為奇數?%c\n", input % 2 ? 'Y' : 'N');

    return 0;
}

執行結果:

輸入整數:3 
該數為奇數?Y

在 C 中非零數值都可以表示真,而 0 表示假,所以輸入的數為奇數時,就不能被 2 整除,所以餘數一定不是 0,在條件式中表示真, 因而傳回字元 'Y',若數值為偶數,則被 2 整除,所以餘數為 0,在條件式中表示假,所以傳回字元 'N'