如何检查给定数字在C中是偶数还是奇数?
使用模 (%) 运算符检查除以 2 时是否有余数:
if (x % 2) { /* x is odd */ }
一些人批评了我上面的回答,说使用 x & 1 是“更快”或“更有效”。我不相信是这样的。
出于好奇,我创建了两个简单的测试用例程序:
/* modulo.c */ #include <stdio.h> int main(void) { int x; for (x = 0; x < 10; x++) if (x % 2) printf("%d is odd\n", x); return 0; } /* and.c */ #include <stdio.h> int main(void) { int x; for (x = 0; x < 10; x++) if (x & 1) printf("%d is odd\n", x); return 0; }
然后我在我的一台机器上用 gcc 4.1.3 编译了 5 次:
我检查了每次编译的汇编输出(使用 gcc -S),发现在每种情况下,and.c 和 modulo.c 的输出都是相同的(它们都使用了 andl $1, %eax 指令)。我怀疑这是一个“新”功能,我怀疑它可以追溯到古代版本。我也怀疑任何现代(过去 20 年制造的)非神秘编译器,无论是商业的还是开源的,都缺乏这种优化。我会在其他编译器上进行测试,但目前我没有任何可用的。
如果其他人愿意测试其他编译器和/或平台目标,并得到不同的结果,我很想知道。
最后,标准保证 模版本无论整数是正数、负数还是零都可以工作,而不管实现对有符号整数的表示。按位与版本不是。是的,我意识到二进制补码无处不在,所以这不是一个真正的问题。