C 語言邏輯非運算符 ! 詳解:非零即真、零即假的隱式轉換規則
! 是邏輯非運算符,對操作數進行真假判斷後取反。
核心規則
| 操作數值 | 邏輯值 | !操作數 結果 | 結果類型 |
| 0 | 假 (false) | 1 (真) | int |
| 非零 (任意) | 真 (true) | 0 (假) | int |
| NULL 指針 | 假 | 1 | int |
| 非 NULL 指針 | 真 | 0 | int |
代碼示例
int a = 0;
printf("%d\n", !a); // 1
int b = -5;
printf("%d\n", !b); // 0
int *p = NULL;
printf("%d\n", !p); // 1
char *str = "hello";
printf("%d\n", !str); // 0
常見用法模式
| 模式 | 等價寫法 | 說明 |
if (!ptr) | if (ptr == NULL) | 檢查指針是否為空 (慣用) |
if (!strcmp(s1, s2)) | if (strcmp(s1, s2) == 0) | 字符串相等判斷 (strcmp 相等返回 0) |
while (!feof(fp)) | while (feof(fp) == 0) | 文件未結束繼續讀取 |
flag = !flag; | flag = (flag == 0); | 布爾值翻轉 (0↔1) |
優先級與結合性
- 優先級:最高 (僅次於 `()` `[]` `->` `.` 等後綴運算符)
- 結合性:右結合 (單目運算符特性)
- 因此
!a + b 解析為 (!a) + b
易混淆點辨析