最直接的方式是用 for 循环遍历数组,以 num % 2 != 0 判断奇数;因 C++ 中负数取余符号随被除数(如 -3 % 2 == -1),故不可只写 == 1。

用 for 循环遍历并判断余数
最直接的方式是遍历数组每个元素,用 % 运算符检查是否为奇数:num % 2 != 0。注意:负数对 2 取余在 C++ 中结果符号与被除数一致(如 -3 % 2 == -1),所以不能只写 num % 2 == 1,必须用 != 0。
示例:
int arr[] = {1, -2, 3, 0, -5, 4};
int count = 0;
for (int i = 0; i < 6; ++i) {
if (arr[i] % 2 != 0) count++;
}
-
arr[i] % 2 != 0覆盖正奇数、负奇数(如-1,-3) - 别漏掉
0—— 它是偶数,0 % 2 == 0,不会被计入 - 数组长度需显式传入或计算(
sizeof(arr)/sizeof(arr[0])仅适用于栈上定义的数组)
用 std::count_if 配合 lambda(C++11+)
更现代、更少出错的写法,尤其适合容器或已知迭代器范围的场景。它自动处理边界,逻辑集中,且可读性高。
示例(对 std::vector):
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
立即学习“C++免费学习笔记(深入)”;
std::vector<int> v = {1, -2, 3, 0, -5, 4};
auto count = std::count_if(v.begin(), v.end(), [](int x) { return x % 2 != 0; });
- lambda 中仍用
x % 2 != 0,不是== 1 - 对原生数组也可用:
std::count_if(std::begin(arr), std::end(arr), ...)(C++14 起支持std::begin/std::end对原生数组) - 如果编译器不支持 C++11 或更高版本,这个写法不可用
误判奇数的常见错误
实际调试中,这几个点最容易导致统计错误:
- 写成
num % 2 == 1:会漏掉所有负奇数(如-3 % 2 == -1) - 用位运算
(num & 1) == 1:对无符号数安全,但对有符号负数,C++ 标准未规定补码以外的表示方式;尽管绝大多数平台是补码,-3 & 1确实为 1,但依赖实现,不如% 2 != 0语义清晰、可移植 - 忘记初始化计数器变量:C++ 不自动初始化局部
int,未赋初值的count是垃圾值 - 循环越界:用
i 而非 <code>i ,多访问一个非法内存
性能和类型注意事项
对普通 int 数组,三种方法(手写循环 / count_if / std::accumulate)性能差异几乎可以忽略。但要注意:
-
std::count_if在 debug 模式下可能有额外检查开销,release 下基本等价于手写循环 - 如果数组元素是
short或char,参与%运算时会整型提升为int,无问题;但若用&位运算,需确认符号扩展行为 - 对于
unsigned int,% 2 == 1是安全的,但统一用!= 0更省心,避免类型切换时出错
% 2 != 0,而不是看余数是不是 1。其他都是围绕这个核心的包装或优化。

















