for循环基本结构为:for(初始化; 条件判断; 更新表达式)。三部分用分号隔开,缺一不可;初始化声明循环变量(作用域限于for语句),条件判断控制循环执行,更新表达式在每次循环体后执行。

for 循环的基本结构怎么写
C++ 的 for 循环必须包含三部分,用分号隔开:初始化、条件判断、更新表达式。缺一不可,哪怕某部分为空也得留着分号。
- 初始化通常声明并赋值一个循环变量,比如
int i = 0,它的作用域仅限于整个for语句(C++11 起) - 条件判断在每次循环开始前检查,为
false时立即退出 - 更新表达式在每次循环体执行之后运行,常见的是
i++或i += 2
++i
- 需要反向遍历:
for (int i = n - 1; i >= 0; --i) - 步长不为 1:
for (int i = 0; i - 多变量同步更新:
for (int i = 0, j = n - 1; i - 遍历 C 风格数组并需要下标:
for (int i = 0; i
如果只是顺序遍历容器元素且不需要下标,优先用 range-based for(for (const auto& x : vec)),它更安全、更简洁,也不会因手误导致越界。
容易踩的坑:边界、符号和副作用
这几个错误高频出现,而且编译器通常不报错,但行为完全不对:
- 循环条件用
却忘了调整上界,导致访问越界:for (int i = 0; i →vec[vec.size()]是未定义行为 - 用无符号类型(如
size_t)做递减循环:for (size_t i = 5; i >= 0; --i)→i永远不会小于 0,变成死循环 - 在循环条件里调用可能改变状态的函数:
for (int i = 0; i → 每次都重新计算,性能差还可能逻辑错 - 修改循环变量本身(在循环体内):
for (int i = 0; i → 逻辑难读,易出错,应改用while
for 和 for-range 在 vector 上的行为差异
传统 for 直接操作索引,能随机访问、修改元素、跳过位置;range-based for 只提供对每个元素的引用或拷贝。
std::vector<int> v = {1,2,3};
// 可修改第 2 个元素
for (size_t i = 0; i // 同样效果,但更直观(需引用)
for (auto& x : v) {
if (&x == &v[1]) x = 99;
}</int>
但注意:如果循环中调用了可能使迭代器失效的操作(如 v.push_back()),range-based for 会直接崩溃,而传统 for 用索引则不受影响——这是底层机制决定的,不是语法问题。
用索引还是用 range-based,关键看你要不要下标、要不要跳步、容器是否稳定。别为了“看起来现代”硬套 range-based。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











