C語言真假值判斷機制深度解析
核心規則
C 語言中:0 為假,非 0 為真
if(t) vs if(!t) 對比
| 表達式 | t 的值 | 條件結果 | 執行分支 | 等價寫法 |
| if (t) | t != 0 | 真 (1) | 執行 if 體 | if (t != 0) |
| if (t) | t == 0 | 假 (0) | 跳過 if 體 | if (t != 0) |
| if (!t) | t == 0 | 真 (1) | 執行 if 體 | if (t == 0) |
| if (!t) | t != 0 | 假 (0) | 跳過 if 體 | if (t == 0) |
邏輯非運算符 ! 詳解
// ! 運算符真值表
!0 = 1 // 非零變零
!非0 = 0 // 零變非零
// 實際應用
int flag = 1;
if (!flag) // 等同於 if (flag == 0)
printf("flag 為 0\n");
int count = 0;
if (!count) // 等同於 if (count == 0)
printf("count 歸零\n");
常見類型的真假判斷
| 類型 | 假值 | 真值示例 | 注意事項 |
| 整數 (int, char, long...) | 0 | 1, -1, 100, 'A' | 負數也是真 |
| 浮點數 (float, double) | 0.0 | 0.1, -3.14, 1e-10 | 極小非零也是真 |
| 指針 | NULL (0) | 有效地址 | if(ptr) 檢查非空 |
| 結構體 | 不直接判斷 | - | 需比較具體成員 |
實戰代碼示例
#include <stdio.h>
#include <stdbool.h> // C99 布爾類型
void check_value(int t) {
printf("t = %d: ", t);
if (t)
printf("if(t) 執行 ");
else
printf("if(t) 跳過 ");
if (!t)
printf("if(!t) 執行\n");
else
printf("if(!t) 跳過\n");
}
int main() {
check_value(0); // 假
check_value(1); // 真
check_value(-5); // 真(非零即真)
check_value(100); // 真
// 指針判斷慣用法
int *ptr = NULL;
if (!ptr) // 等同於 if (ptr == NULL)
printf("指針為空\n");
ptr = malloc(100);
if (ptr) // 等同於 if (ptr != NULL)
printf("內存分配成功\n");
return 0;
}
最佳實踐建議
- 明確比較:
if (t != 0) 比 if (t) 可讀性更好
- 指針檢查:習慣用
if (ptr) / if (!ptr),簡潔且符合慣例
- 浮點數比較:避免
if (f == 0.0),用 if (fabs(f) < EPS)
- 布爾變量:C99 起包含
<stdbool.h> 使用 bool、true、false
經典陷阱
// 陷阱1:賦值誤寫為比較
if (x = 5) // 永遠為真!賦值表達式值為 5
// 應為 if (x == 5)
// 陷阱2:浮點數精度
float f = 0.1f + 0.2f;
if (f == 0.3f) // 可能為假!
printf("相等\n");
// 陷阱3:字符串比較
char *s = "hello";
if (s == "hello") // 比較地址而非內容!不一定真
// 應用 strcmp(s, "hello") == 0