检查循环条件是否用了——需确认循环语句(如for、while)的条件表达式是否正确编写,避免无限循环或跳过执行,确保逻辑符合预期。

检查循环条件是否用了
这是最常见也最容易忽略的原因。比如 for (int i = 0; i 本意是遍历 <code>n 个元素(索引 0 到 n-1),结果多跑了一次 i == n,访问 arr[n] 就越界了。
- 数组/容器遍历时,优先用
i ,而不是 <code>i ,后者在 <code>size()返回无符号类型时可能整数溢出变成极大值 - 用迭代器时,别写
it != end() + 1或手动加偏移,直接比it != end() - 如果逻辑上真需要“执行 n+1 次”,显式写成
i 并加注释,避免后续维护者误改
确认循环变量是否在体内被意外修改
循环变量在 for 或 while 中被二次赋值,会导致行为失控。例如:
for (int i = 0; i < 5; ++i) {
if (some_condition) i++; // 这里多加了一次,下次循环就跳过一个值,但末尾又 ++i → 实际多执行一次
}- 禁止在循环体中修改循环控制变量(尤其是
for的变量) - 若必须跳过某些项,用
continue;若要提前结束,用break - 对
while循环,检查迭代表达式是否漏写、或被if块包裹而未执行
do-while 循环天然至少执行一次,注意和 while 的语义差异
do-while 的结构决定了它总比 while 多执行一次主体——哪怕初始条件为假。比如:
int x = -1;
do {
printf("%d\n", x);
} while (x > 0); // 输出 -1,然后退出- 当逻辑要求“先判断再执行”,必须用
while;用do-while时,默认接受首次无条件执行 - 调试时可在循环入口加日志,观察第一次输出是否符合预期
- 把
do-while改成while前,务必验证初始状态是否允许零次执行
边界值测试时注意 signed/unsigned 混合比较
当循环上限是 size_t(如 vector::size()),而你用 int i 作计数器,i 在 <code>container 为空时会出问题:
立即学习“C++免费学习笔记(深入)”;
-
container.size()是无符号 0,i 成立 → 进入循环 - 接着
i--或类似操作会让i变成极大正数(溢出),导致无限循环或越界 - 统一使用同符号类型:要么全用
size_t i,要么用有符号类型时显式转成static_cast<int>(container.size())</int>并确保不会溢出
多执行一次看似小问题,但常是内存越界、数组访问异常或栈溢出的前兆。重点盯住循环条件表达式、变量作用域和类型匹配这三处,比加断点更快定位。


















