for循环改步长需在第三表达式指定,如for(int i=0; i

for 循环里怎么改步长?别只写 i++
默认的 i++ 每次只加 1,想每次加 2、加 5 或者减 3,得手动改第三表达式。C++ 的 for 语法本身完全支持任意步长,关键在第三部分(循环后操作)写对。
常见错误是把步长逻辑塞进循环体里,比如在 {} 里再写一遍 i += 2,结果导致重复递增、跳过元素甚至死循环。
- 正确写法:把步长直接写在
for的第三段,例如for (int i = 0; i - 步长可以是负数:
for (int i = 10; i >= 0; i -= 2) - 步长可以是变量或函数调用:
for (int i = 0; i ,但要确保 <code>step_size不为 0,否则无限循环 - 注意边界条件:用
还是 <code> 取决于你是否想包含终点值,比如遍历偶数索引数组时,<code>i 更安全
遍历容器时用步长容易出什么问题?
对 std::vector 或数组用下标 + 步长很常见,但要注意越界和类型匹配。
- 如果用
size_t(无符号)作索引,步长为负会导致极大正数溢出,程序行为未定义 —— 必须用有符号整型如int或ptrdiff_t - 容器大小可能不是步长的整数倍,
i 能自动截断,但别假设最后一次迭代一定“刚好”停在末尾 - 用迭代器模拟步长(如
it += 2)仅对随机访问迭代器有效(vector、deque可以,list不行)
替代方案:while 循环 or 算法函数更合适吗?
当步长逻辑复杂(比如动态变化、依赖前一次计算),硬塞进 for 头部反而难读。这时 while 更直白:
int i = 0; while (i <p>或者用标准算法配合 lambda(C++20 起支持步进视图):</p>
- C++20:
std::views::iota(0, n) | std::views::stride(3)生成步长为 3 的索引序列 - 老标准没
stride,但可以用std::generate_n配合自增 lambda 模拟,不过通常不如手写for清晰
容易被忽略的细节:浮点步长和精度陷阱
用 float 或 double 做循环变量 + 步长(比如 for (double x = 0.0; x )大概率不会正好停在 1.0,因为 0.1 无法精确表示为二进制浮点数。
- 结果是循环多执行一次或少一次,取决于舍入方向
- 解决办法:用整数计数器控制次数,再换算成浮点值,例如
for (int i = 0; i - 或者改用整数运算全程,只在真正需要时转浮点
步长看着简单,但类型、符号、精度、容器特性这几个点一碰就容易翻车。写之前先想清楚:步长固定吗?索引有符号吗?终点是否必须精确命中?
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











