From Gossip@caterpillar

C Gossip: 關係(Relational)運算、條件(Conditional)運算

數學上有比較的運算,像是大於、等於、小於等等,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中,所有非零的數值在作為條件式時都被視為真。

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