程式常需比較兩值大小以決定流程。C 提供六種關係運算子:<、<=、>、>=、==、!=。皆為雙目、左結合。優先級:算術 > 關係 > 賦值。< <= > >= 優先於 == !=。
關係表達式值為 1(真)或 0(假)。字元參與運算用 ASCII 碼。多重關係表達式如 k==j==i+5,左結合先算 k==j 得 0,再算 0==i+5 得 0。
三種邏輯運算子:&&(與)、||(或)、!(非)。&& || 雙目左結合,! 單目右結合。優先級:! > 關係 > && > || > 賦值。
求值規則:
&&:雙真才真。||:一真即真。!:真變假、假變真。判斷真假時:0 為假,非 0 為真。故 5 && 3 為真(1),5 || 0 為真(1)。
if 語句三種形式if (表達式) 語句;
// 表達式真則執行語句
例:輸入兩數較大者。max=a; if(max<b) max=b;
if-else 型if (表達式) 語句1; else 語句2;
// 真執行1,假執行2
例:同前,改用 if-else 輸出較大值。
if-else-if 多重分支if (expr1) stmt1;
else if (expr2) stmt2;
else if (expr3) stmt3;
...
else stmtN;
// 依序判斷,首真執行對應語句,隨後跳出整個結構
例:判斷輸入字元類別(控制字元、數字、大寫、小寫、其他),依 ASCII 碼區間判斷。
if 使用注意點if(a=5) 恆真;if(a=b) 賦值後以結果判斷,常見用法。{} 包成複合語句,} 後不加分號。if 巢狀與 else 配對規則巢狀 if 易產生 else 歧義:
if (expr1)
if (expr2) stmt1;
else stmt2; // else 配對給誰?
C 規定:else 永遠與最近的未配對 if 配對。以上例 else 屬於內層 if。若要讓外層 if 配對,需用大括號明確界定。
建議:多分支優先用 if-else-if 扁平化,減少巢狀,提升可讀性。
? : 與條件表達式三目運算子,形式:expr1 ? expr2 : expr3。expr1 真取 expr2,否取 expr3。常用於簡化單賦值分支:
max = (a>b) ? a : b; // 等價於 if-else 版
注意:
max=a>b?a:b 合法。? 與 : 成對出現。a>b?a:c>d?c:d 解析為 a>b?a:(c>d?c:d)(巢狀條件表達式)。switch 多重選擇
switch (表達式) {
case 常量1: 語句1; break;
case 常量2: 語句2; break;
...
default: 語句N;
}
特點:case 只是標籤,匹配後**不自動跳出**,會貫穿執行後續所有 case(含 default),故**必須用 break 跳出**。
例:輸入 1~7 輸出星期幾,若無 break 輸入 3 會印 Wednesday 到 Sunday。加上 break 修正。
switch 使用細節case 常量值不可重複。case 後可跟多句,無需大括號。case/default 順序可任意調換不影響結果。default 可省略。先比較 a,b 存入 max,min,再與 c 比較更新。
輸入 a 運算子 b,switch(運算子) 執行四則運算,預設報錯。