// 版本一:逆序輸出邏輯錯誤
if (b = 5) printf("逆序輸出:%d%d%d%d%d\n", c5,c4,c3,c2,c1);
else if (b = 4) printf("逆序輸出:%d%d%d%d\n", c5,c4,c3,c2);
// ...
// 版本二:正確邏輯(但用 c1!=0 等判斷位數)
if (c1 != 0) printf("逆序輸出:%d%d%d%d%d\n", c5,c4,c3,c2,c1);
else if (c2 != 0) printf("逆序輸出:%d%d%d%d\n", c5,c4,c3,c2);
// ...
if (b = 5) 是賦值,非比較!b = 5 將 5 賦值給 b,表達式值為 5(真)。if 判斷表達式值非 0 → **條件永真**。else if (b = 4) **永不執行**(因前面 if 已進入)。b 被改為 5。== 比較if (b == 5) printf("逆序輸出:%d%d%d%d%d\n", c5,c4,c3,c2,c1);
else if (b == 4) printf("逆序輸出:%d%d%d%d\n", c5,c4,c3,c2);
else if (b == 3) printf("逆序輸出:%d%d%d\n", c5,c4,c3);
else if (b == 2) printf("逆序輸出:%d%d\n", c5,c4);
else printf("逆序輸出:%d\n", c5);
c1 是萬位)。c1!=0 → 5位;else c2!=0 → 4位 ...。b,直接用提取的數字特性判斷,**更魯棒**——甚至不需要 b 變量。**開啟警告選項!**
-Wall -Wextra -Wparentheses(或 -Werror=parentheses 視為錯誤)。/Wall 或 /W4 + /wd4706(禁用特定警告)反而要開啟 C4706「assignment within conditional expression」。warning: suggest parentheses around assignment used as truth value。if (5 == b)。若誤寫 =,編譯報錯「左值不可修改」。-Werror -Wparentheses。| 運算符 | 含義 | 常見錯誤 | 正確示例 |
|---|---|---|---|
= | 賦值 | if (a = 5) | a = 5; |
== | 相等比較 | if (a == 5) 寫成 = | if (a == 5) |
+= | 加賦值 | if (a += 5) 當判斷 | a += 5; |
&& | 邏輯與 | if (a & b) 位運算代替邏輯 | if (a && b) |
& | 按位與 | if (a && b) 邏輯與代替位運算 | c = a & b; |
本題核心教訓:if (b = 5) 是賦值表達式,值為 5(真),導致分支永真、邏輯崩塌。
修正:統一用 == 比較,或直接用數字特性(如版本二)判斷。
工程化對策:編譯器警告拉滿(-Wall -Wparentheses)+ 靜態分析 + 單元測試,將此類低級錯誤消滅在編譯/測試階段。