for循环基本写法为:i从0开始,到n-1结束,直接用i作为循环变量。

for循环的基本写法:i从0开始,到n-1结束
直接用 i 作为循环条件,而不是 <code>i —— 前者更简洁、不易越界,也符合C++惯用法。只要 <code>n 是非负整数(比如 size_t 或 int),这个写法就安全。
常见错误是写成 i ,当 <code>n == 0 时,n-1 变成极大正数(尤其 size_t 下),导致无限循环或越界访问。
for (int i = 0; i —— 推荐,语义清晰,适配所有有符号整型for (size_t i = 0; i —— 若 <code>n是size_t(如vec.size()),必须用size_t或带符号类型转为无符号前确认非负,否则比较可能出错- 避免
for (int i = 0; i —— <code>n == 0时,n-1溢出为4294967295(32位unsigned int),循环跑几亿次
遍历容器时别硬写n,优先用范围for或迭代器
如果目标是遍历 std::vector、std::array 等容器,直接算 n 容易出错,也不够现代。用范围 for 最省心:
for (const auto& x : vec) {
// 处理x,无需索引
}
需要索引时,可配合 size() 和标准写法:
立即学习“C++免费学习笔记(深入)”;
for (size_t i = 0; i —— 注意:若 <code>vec为空,vec.size()是0u,i 为假,循环不执行,正确- 若必须用有符号索引(如后续要减法运算),先断言或检查:
assert(static_cast<int>(vec.size()) >= 0)</int>,再用int i = 0; i (vec.size()); ++i
当n是size_t且可能为0时,循环变量类型要匹配
很多新手把 size_t n = container.size() 和 int i 混用,导致隐式转换警告或逻辑错误。例如:
size_t n = vec.size();
for (int i = 0; i < n; ++i) { ... } // 警告:比较有符号与无符号
编译器可能静默提升 i 为 size_t,但若 i 曾为负,行为未定义。稳妥做法:
- 统一用
size_t i,前提是循环体里不做负向运算 - 改用带符号类型:确保
n不超INT_MAX,再写int n_signed = static_cast<int>(n); for (int i = 0; i </int> - 或者用
ptrdiff_t(指针差值类型),它能安全容纳任意容器的索引范围
性能和可读性:++i 和 i++ 在for里没区别,但习惯写++i
对于内置类型(int、size_t),++i 和 i++ 编译后完全一样,现代编译器会优化掉冗余副本。但写 ++i 是C++社区约定,也为以后换成自定义迭代器留余地。
真正影响性能的是循环体内的操作,比如在循环里反复调用 vec.size()(没内联时可能多一次函数调用):
- ❌
for (size_t i = 0; i —— 每次都查大小 - ✅
const size_t n = vec.size(); for (size_t i = 0; i —— 查一次,更高效也更清晰
边界检查、类型匹配、提前缓存长度——这些细节不显眼,但线上出问题时,往往就卡在这几步上。


















