代碼 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 規定: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
// 偶數
i%2 為 i&1。i & 1,意圖更明確、性能不劣。if (i % 2 == 1) 判斷奇數:錯誤,負奇數會漏判(-3 % 2 == -1)。正確寫法 if (i % 2 != 0) 或 if (i & 1)。% 僅適用於整數類型。浮點數用 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):無除法、無負數符號歧義、意圖明確、編譯器友好。==1 陷阱,養成 !=0 或位運算習慣。