C 语言反向遍历的正确姿势
Iterating Backwards in C
在 LLM 时代,很多人依然习惯用错误的方式在 C 语言中反向遍历数组。常见的误区是直接使用 i >= 0 作为循环条件,这在 size_t 类型下会导致逻辑错误,甚至让编译器发出警告。改用有符号类型 ssize_t 虽然能跑通,却引入了类型转换、跨平台兼容性以及整数提升等隐患。其实,C 语言中反向遍历有一个更优雅、更安全的写法:利用后置递减运算符 i-- 的特性,直接写成 for(size_t i = count; i--; )。这种方式不仅代码简洁,还能利用无符号整数溢出的定义行为避免边界问题,无需任何额外的类型转换或特殊检查。
你可以一眼看出某人是否正确实现了反向循环。
HN 评论区
10- kenferry
我知道这有点“过于聪明”,但如果我写的代码没人会看,
while (i --> 0) {
// 使用 array[i]
}
既容易阅读(虽然未必容易理解),又完全正确!
- MaulingMonkey
我更喜欢这样写:
const size_t n = 10;
for (size_t i = n; i --> 0;) {
std::cout << i << "\n";
}
- abstractspoon
我用这个方法已经超过 30 年了!