首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C 語言邏輯非運算符 ! 詳解:非零即真、零即假的隱式轉換規則

     編輯:C 語言問答

C 語言邏輯非運算符 ! 詳解:非零即真、零即假的隱式轉換規則

! 是邏輯非運算符,對操作數進行真假判斷後取反。

核心規則

操作數值邏輯值!操作數 結果結果類型
0假 (false)1 (真)int
非零 (任意)真 (true)0 (假)int
NULL 指針假1int
非 NULL 指針真0int

代碼示例

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

易混淆點辨析

最佳實踐建議

  1. 條件判斷優先用 ! 簡潔表達「非」語義
  2. 避免 !!expr 雙重否定 (除非為了規範化為 0/1)
  3. 指針判斷 if (ptr) / if (!ptr) 是社區慣例,比顯式比較 `NULL` 更通用
  4. 字符串比較 !strcmp() 需加註釋,初學者易誤解為「不相等」
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
運算符名稱示例結果
!邏輯非!50
~按位取反~5 (二進制 ...0101 → ...1010)-6 (補碼)
-算術取負-5-5