c++中%仅支持整型,浮点数使用会编译报错;负数取模结果符号同被除数,需用((x%m)+m)%m转为非负;模数不能为0,否则未定义行为;遍历数组取模时须注意类型、符号及边界处理。

直接对数组元素用 % 运算符就行,但得确保操作数是整型
取模运算在 C++ 中只支持整数类型(int、long、short 等),浮点数用 % 会编译报错:invalid operands to binary %。所以如果数组是 float 或 double,不能直接写 a[i] % 10。
实操建议:
- 确认数组类型:用
int arr[5] = {7, 12, 19, 25, 31};这类定义,才能安全使用% - 避免负数取模的歧义:C++ 中负数取模结果符号与被除数一致,例如
-7 % 3得-1,不是2;如需非负余数,可写((x % m) + m) % m - 模数不能为 0:运行时若写
arr[i] % 0,行为未定义,多数平台会触发SIGFPE(浮点异常信号)
遍历数组做取模时,别漏掉边界和符号处理
常见错误是只关注“能算”,却忽略余数范围或越界访问。比如想把所有元素映射到 [0, 9],直接 arr[i] % 10 对正数没问题,但遇到负数就出意外。
示例场景:统计个位数字频次
int count[10] = {}; // 初始化为 0
for (int i = 0; i
<p>要点:</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill2659" title="C++"><img
src="https://img.php.cn/upload/skill/000/000/081/178927213426672.jpg" alt="C++" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill2659" title="C++" class="overflowclass">C++</a>
<p class="overflowclass">"空空如也"</p>
</div>
<a rel="nofollow" href="/xiazai/skill2659" title="C++" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
- 循环变量
i必须严格小于数组长度,否则arr[i]越界——尤其用指针遍历时容易多走一步 - 模数
10是常量时编译器可能优化,但换成变量(如mod)后,每次都要做除法,性能略低 - 如果数组元素值极大(接近
INT_MAX),而模数很小,不会溢出;但若先做加减再取模,中间结果可能溢出,应尽早取模
用 std::vector 时,取模逻辑不变,但要注意迭代器失效风险
有人误以为 vector 要用特殊方式取模,其实和原生数组完全一样:对每个元素调用 % 即可。唯一区别是访问方式。
实操建议:
- 优先用基于范围的
for:for (int& x : vec) { x %= 10; }——简洁且不易越界 - 避免边遍历边
push_back或erase:这可能导致迭代器失效,x %= 10操作本身不触发重分配,但若在循环体内修改容器大小,后续引用可能悬空 - 如果要生成新数组(如只保留能被 3 整除的元素),别原地改
vector,而是用std::copy_if或构造新容器
编译期已知数组大小时,考虑用 constexpr 提前计算
如果数组内容和模数都是编译期常量,可以用 constexpr 数组让取模结果也进常量表达式,减少运行时开销。
示例:
constexpr int input[] = {14, 27, 35, 48};
constexpr int mod = 13;
constexpr std::array<int> remainders = []{
std::array<int> r{};
for (int i = 0; i
<p>注意点:</p>
<ul>
<li>
<code>input</code> 和 <code>mod</code> 都必须是 <code>constexpr</code>,否则 lambda 内无法参与常量求值</li>
<li>数组长度必须显式写出(如 <code>4</code>),不能用 <code>std::size(input)</code>(C++20 前不 constexpr)</li>
<li>这种写法适合配置表、状态码映射等场景,不适合运行时输入的数据</li>
</ul>
实际写的时候,最常踩的坑是忘了负数取模的符号规则,以及把浮点数组和整数取模混在一起用。这两处一错,要么编译不过,要么结果和预期差很远。</int></int>C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










