核心規則
!expr:expr 為 0 (假) → 結果 1 (真);expr 非 0 → 結果 0。
- **類型**:結果為
int (C 標準),值僅 0 或 1。
- **優先級**:高於算術/關係/邏輯二元運算符,低於後綴
++/--、()、[]、->、.。
經典用法場景
| 場景 | 代碼 | 等價寫法 |
| 檢查指針是否為 NULL | if (!p) error(); | if (p == NULL) |
| 檢查字串是否為空 | if (!*s) return; | if (*s == '\0') |
| 切換布爾標誌 | flag = !flag; | flag = 1 - flag; |
| 判斷奇偶 (位運算配合) | if (!(n & 1)) | if ((n & 1) == 0) |
| 簡化複雜條件 | if (!(a > 0 && b < 10)) | 德摩根律:if (a <= 0 || b >= 10) |
優先級陷阱實例
!a + b // 解析為 (!a) + b,非 !(a+b)
!a > b // (!a) > b,即 (0或1) > b
!*p++ // !(*(p++)),先取值後遞增指標
**建議**:複雜表達式**加括號**明確意圖:!(a + b)、(!a) > b。
與按位非 ~`
| 運算符 | 名稱 | 作用 | 示例 |
! | 邏輯非 | 真假取反,結果 0/1 | !5 == 0 |
~ | 按位非 | 每位取反,結果同類型 | ~5 == -6 (補碼) |