有时候需要逆向循环,例如从字符串的最右端遍历到最左端,需要注意一些细节!初学遇到一些 bug 记录在这里。
首先 arr.size()
的数据类型为 size_t
,为无符号整型
对于 for (int idx = arr.size() - 1; idx >= 0; idx--)
:
- 使用
int
作为idx
的类型,有一定概率会编译失败,因为size_t
的具体类型随实现而不同,可能和int
无法兼容,所以建议直接使用std::size_t
或auto
- 另一个比较致命的问题,
size_t
为无符号整型,这意味着,idx >= 0
会永远满足,当idx--
突破 0 时,会回到极大数字……
因此可以考虑 for (long idx = arr.size() - 1; idx >= 0; idx--)
,从无符号数变为有符号数,就可以正常执行循环并跳出了。
但是,这个方法同样存在 long
和 size_t
可能存在不匹配的情况(虽然风险比较小,但确实存在,原因大概是,从无符号数到有符号数的转变,是 implementation-defined behavior[1] )
最优雅的方法应该是:
for (auto idx = arr.size() - 1; idx < bin.length(); --idx)
{
// some code
}
虽然跳出循环的判别标准是 idx < bin.length()
,与正向遍历的标准一致,但是 it works!原因上面提到了。