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

C語言 if(i%2) 含義詳解:奇偶判斷的底層邏輯與最佳實踐

     編輯:C 語言問答

C語言 if(i%2) 真正含義:利用取模餘數判斷奇偶的原理與陷阱

代碼 if (i % 2) 是 C 語言中判斷整數 i 奇偶的經典慣用語。其核心邏輯:

  • i % 2 == 1 → 餘數為 1 → 真 → i 為奇數(正奇數)
  • i % 2 == -1 → 餘數為 -1 → 真 → i 為負奇數
  • i % 2 == 0 → 餘數為 0 → 假 → i 為偶數(含 0)

結論:if (i % 2) 在 i 為奇數(正負皆含) 時執行 if 塊,偶數時不執行。

負數取模規則(C99 規範)

C99 規定:a % b 的符號與被除數 a 相同。即 -3 % 2 == -1,3 % -2 == 1。因此負奇數餘數為 -1(非零),判斷為真,邏輯正確。


#include <stdio.h>

int main() {
    int test[] = {-3, -2, -1, 0, 1, 2, 3};
    for (int k = 0; k < 7; k++) {
        int i = test[k];
        printf("i=%3d, i%%2=%2d, if(i%%2)=%s\n", i, i%2, (i%2)?"真(奇數)":"假(偶數)");
    }
    return 0;
}

輸出:
i= -3, i%2= -1, if(i%2)=真(奇數)
i= -2, i%2=  0, if(i%2)=假(偶數)
i= -1, i%2= -1, if(i%2)=真(奇數)
i=  0, i%2=  0, if(i%2)=假(偶數)
i=  1, i%2=  1, if(i%2)=真(奇數)
i=  2, i%2=  0, if(i%2)=假(偶數)
i=  3, i%2=  1, if(i%2)=真(奇數)

位運算替代方案(更高效、無負數歧義)


if (i & 1)  // 判斷最低位是否為 1
    // 奇數
else
    // 偶數
  • 原理:二進制最低位為 1 ⇔ 奇數,0 ⇔ 偶數。
  • 優勢:無除法開銷,負數同樣適用(補碼表示最低位同樣標識奇偶),編譯器常優化 i%2 為 i&1。
  • 推薦:生產代碼優先用 i & 1,意圖更明確、性能不劣。

常見誤區與避坑

  1. 以為餘數只能是 0 或 1:負數餘數為 -1,但非零即真,不影響邏輯。
  2. 用 if (i % 2 == 1) 判斷奇數:錯誤,負奇數會漏判(-3 % 2 == -1)。正確寫法 if (i % 2 != 0) 或 if (i & 1)。
  3. 浮點數用 %:% 僅適用於整數類型。浮點數用 fmod (math.h) 或位運算(僅限整數語義)。

擴展:任意模數判斷


// 判斷 i 是否為 3 的倍數
if (i % 3 == 0) // 正確,0 是唯一“假”值

// 判斷 i 模 4 的餘數
switch (i % 4) {
    case 0: /* 4k */ break;
    case 1: case -3: /* 4k+1 */ break;
    case 2: case -2: /* 4k+2 */ break;
    case 3: case -1: /* 4k+3 */ break;
}

總結

  • if (i % 2) 正確判斷奇數(含負奇數),偶數(含 0)為假。
  • 生產代碼推薦 if (i & 1):無除法、無負數符號歧義、意圖明確、編譯器友好。
  • 理解 C99 取模符號規則,避免 ==1 陷阱,養成 !=0 或位運算習慣。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved