用 % 2 判断奇偶最可靠,应始终用 n % 2 == 0 或 != 0,避免 == 1 或 == -1;负数取模结果为负,std::abs 可能溢出且不必要;位运算 n & 1 更快但需注意类型兼容性。

用 % 判断奇偶是最直接的方式
整数对 2 取模结果为 0 就是偶数,否则是奇数。这是最常用也最可靠的判断逻辑,不依赖符号、不关心正负,int、long 甚至 short 都适用。
常见错误现象:-3 % 2 在 C++ 中结果是 -1(不是 1),所以直接写 n % 2 == 1 会漏掉负奇数。
- 正确写法始终用
n % 2 == 0判断偶数,或n % 2 != 0判断奇数 - 别用
n % 2 == 1或n % 2 == -1—— 条件分支变多,还容易出错 - 如果变量类型是无符号数(如
unsigned int),% 2没问题,但没必要转成有符号再算
std::abs(n) % 2 不是好主意
有人想“统一成正数再取模”,于是写 std::abs(n) % 2。这看似安全,实则引入两个隐患:
-
std::abs(INT_MIN)在二进制补码系统下会溢出(UB),比如int最小值取绝对值后仍是负数 - 多一次函数调用 + 可能的分支跳转,对高频判断(如循环内)有微小但可测的开销
- 纯属画蛇添足 —— 奇偶性本就与符号无关,
% 2的结果已经能准确反映
位运算 n & 1 更快但要注意类型
对任意有符号整数,n & 1 看最低位是否为 1,也能判断奇偶,且通常比 % 快一点(尤其在优化开启时)。
立即学习“C++免费学习笔记(深入)”;
使用场景:性能敏感代码(如图像处理、嵌入式循环)、已确认 n 是整型且非 bool 或 char(避免隐式提升干扰)。
-
char c = -1;→c & 1结果是1(因为char提升为int后仍为负,但位运算是按补码做的,结果正确) - 但
bool b = true;→b & 1虽然也得1,可语义不清,不如直接用b - 如果变量是
unsigned long long,& 1安全;但若类型是float或指针,编译不过 —— 别硬套
模板函数封装时别忽略 unsigned 和 char
写通用判断函数时,容易只考虑 int,结果在 unsigned char 上出问题:
template<typename T>
bool is_odd(T n) { return n % 2 != 0; }
这段代码对 unsigned char x = 255; 是对的,但若你传入 char x = -1;,它仍然工作 —— 因为 char 会被整型提升为 int,而 % 行为由提升后的类型决定。
- 真正要小心的是自定义整型(如
using byte = unsigned char;),确保模板参数支持%运算 - 如果函数可能被用于
enum class,需显式转换,否则编译失败 - 不需要特化
bool:bool只有两个值,b % 2合法但多余,直接用b就行
== 1 或一次未检查的 abs,可能在特定输入下埋几天才复现的问题。









