i通常从0开始,因c++数组、vector、string等均为0-based索引;倒序遍历时应避免unsigned类型溢出,推荐用int或size_t配合i-- > 0写法。

for循环里i该从0还是1开始?
取决于你要访问的数据结构索引规则,不是语法要求。C++数组、std::vector、std::string 都是0-based,所以绝大多数情况用 i = 0 更安全。
常见错误现象:std::vector<int> v = {1,2,3}; for(int i = 1; i —— 这会越界访问 <code>v[3](非法),且漏掉 v[0]。
- 用
i = 0; i 是最稳妥的写法 - 如果逻辑上真需要“第1个、第2个……”(比如用户输入编号),建议把显示逻辑和索引分离:内部仍用
i访问,输出时显示i + 1 -
v.size()返回size_t(无符号),和有符号的int i混用可能触发隐式转换警告,更严谨可写for(size_t i = 0; i
循环中i++和++i有区别吗?
在简单整型循环变量场景下,现代编译器基本会优化成一样;但语义不同,且在自定义类型(如迭代器)中可能有性能差异。
使用场景:遍历 std::list 或其他非随机访问容器时,++it 比 it++ 少一次拷贝——因为后置递增要返回旧值,需构造临时对象。
- 对
int i:选++i是好习惯,但不必为此重构旧代码 - 对迭代器(
auto it):优先用++it,尤其在性能敏感循环中 - 错误写法示例:
for(auto it = lst.begin(); it != lst.end(); it++)→ 改成++it
for循环里定义int i和在外面定义有什么影响?
作用域和可重用性是主要差别。C++11起推荐在 for 内声明,更安全。
常见错误现象:循环外还用 i,结果发现它在循环结束后值不确定(尤其用了 break 或异常退出);或者多个循环共用一个 i,导致逻辑串扰。
- 在
for(int i = 0; ...)中定义:作用域仅限循环内,无法误用,也便于编译器做优化 - 在循环外定义
int i;:只有当你需要循环后继续用这个值(比如记录最后位置),才合理 - 若循环嵌套,外面定义
i和j容易混淆,且内层改i会影响外层
为什么有时候循环跑着跑着i突然变负数了?
大概率是 unsigned 类型溢出,比如用 size_t i 做倒序循环:for(size_t i = v.size()-1; i >= 0; --i) —— i >= 0 永远为真,i 减到 0 后再减会绕回极大值(如 18446744073709551615),接着继续减,直到触发超长循环或崩溃。
- 倒序遍历时,别用
unsigned做条件判断,改用有符号类型:for(int i = v.size() - 1; i >= 0; --i)(注意v.size()可能很大,确保int足够) - 更安全的倒序写法:
for(size_t i = v.size(); i-- > 0; )—— 利用后置递减的特性,先用再减,且条件判断在减之前 - 调试时看到
i突然极大或负,第一时间查类型和循环边界逻辑
循环变量看着小,但类型、符号性、作用域、递增方式,每个细节都可能在特定条件下暴露问题。最容易被忽略的是无符号整数的溢出行为——它不会报错,只会静默绕回,等你发现时往往已经遍历错乱或死循环了。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











