最推荐用 n % 2 == 0 判断偶数,它安全支持全范围有符号整数;负奇数取余为 -1,故不可用 n % 2 == 1 判奇数;n & 1 更快但需确保类型无符号或非负;避免 abs(n) % 2 防溢出;模板函数应约束整型。

用 % 运算符是最直接的方法
整数对 2 取余,结果为 0 就是偶数,非 0(实际只能是 1 或 -1)就是奇数。注意 C++ 中负数取余结果符号跟随被除数,所以 -3 % 2 是 -1,仍可安全用于奇偶判断。
推荐写法:
if (n % 2 == 0) {
// 偶数
} else {
// 奇数
}
不建议写成 n % 2 == 1 判断奇数,因为负奇数(如 -5)会让 % 返回 -1,条件不成立。
用位运算 & 更快但要注意符号
对无符号整数或已知非负的 int,n & 1 是常用优化:最低位为 1 表示奇数,为 0 表示偶数。它比取余快,且无需处理负号问题——因为底层补码表示下,负奇数的最低位仍是 1。
立即学习“C++免费学习笔记(深入)”;
但需注意:
-
int是有符号类型,标准不保证负数补码表示(尽管几乎所有平台都是),严格可移植代码应避免依赖 - 若
n是unsigned int或你控制输入范围(如循环索引、数组下标),n & 1安全又高效 - 别写成
n & 0x1——没坏处但没必要,1就是0x1
遇到 abs(n) % 2 这种写法要小心
有人想“统一转正再判断”,但 abs(INT_MIN) 在 32 位系统上会溢出(INT_MIN = -2147483648,而 INT_MAX = 2147483647),触发未定义行为。
所以:
- 不要对可能为
INT_MIN的变量调用abs() - 更别用
abs(n) % 2 == 1,既慢又危险 - 回到最开始的
n % 2 == 0,它天然支持全范围int
模板函数封装时别忽略类型退化
如果写个通用函数,比如:
template<typename T>
bool is_even(T n) { return n % 2 == 0; }
它对 char、short 等小整型也能工作,但要注意:C++ 会把它们提升为 int 再运算,所以没问题。真正容易错的是浮点类型——编译器不会自动拒绝 is_even(3.14),除非你加 static_assert 或概念约束。
简单防御方式:
- 用
std::is_integral_v<T>静态断言 - 或者干脆只重载
int、long、long long和对应无符号类型
奇偶性本身只对整数有意义,浮点数传进来大概率是逻辑错误,早点暴露比静默返回假结果好。


















