C++ 反向遍历 array 小记

有时候需要逆向循环,例如从字符串的最右端遍历到最左端,需要注意一些细节!初学遇到一些 bug 记录在这里。

首先 arr.size() 的数据类型为 size_t,为无符号整型

对于 for (int idx = arr.size() - 1; idx >= 0; idx--):

  • 使用 int 作为 idx 的类型,有一定概率会编译失败,因为 size_t 的具体类型随实现而不同,可能和 int 无法兼容,所以建议直接使用 std::size_tauto
  • 另一个比较致命的问题,size_t 为无符号整型,这意味着, idx >= 0 会永远满足,当 idx-- 突破 0 时,会回到极大数字……

因此可以考虑 for (long idx = arr.size() - 1; idx >= 0; idx--),从无符号数变为有符号数,就可以正常执行循环并跳出了。
但是,这个方法同样存在 longsize_t 可能存在不匹配的情况(虽然风险比较小,但确实存在,原因大概是,从无符号数到有符号数的转变,是 implementation-defined behavior

最优雅的方法应该是:

for (auto idx = arr.size() - 1; idx < bin.length(); --idx)
{
// some code
}

虽然跳出循环的判别标准是 idx < bin.length(),与正向遍历的标准一致,但是 it works!原因上面提到了。


  1. https://stackoverflow.com/questions/2397984/undefined-unspecified-and-implementation-defined-behavior#4105123 ↩︎

posted @   BuckyI  阅读(72)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示