为何std::array的operator[]在递减循环中可正常工作?
解析这段C++递减循环的下标逻辑
你贴的代码如下:
for (std::size_t i = a.size() ; i--;) std::cout << a[i] << ' ';
这跟std::array的operator[]没有任何关系,问题完全出在循环里后置递减运算符的执行顺序上。
拆解循环的执行步骤(假设a.size()返回10):
- 初始化阶段:
i被赋值为10 - 第一次循环条件判断:
i--是后置递减操作——先判断当前i的值(10)是否为非0(条件成立),再把i减为9,接着执行循环体访问a[9] - 第二次循环条件判断:
i--判断当前i的值(9)为非0,i减为8,访问a[8] - ……
- 第十次循环条件判断:
i--判断当前i的值(1)为非0,i减为0,访问a[0] - 第十一次循环条件判断:
i--判断当前i的值(0)为假,循环直接终止,此时i会变成SIZE_MAX(std::size_t是无符号类型,0减1的结果),但循环不会再执行
说白了,这个循环的本质就是从i = a.size() - 1开始,遍历到i = 0,完全是运算符的特性导致的,和容器的下标运算符无关。
内容的提问来源于stack exchange,提问作者gidierre
相关产品推荐
相关产品推荐

