我养成了使用for
而不是size_t
声明int
循环索引的习惯。然而,当我向后迭代一个数组时,这已经多次出价,即检查索引是否大于或等于零:
for (size_t i = n-1; i >= 0; i--) {
// ...
}
当身体为i == 0
运行时,它会减少并包裹,可能是SIZE_T_MAX
。这使得休息条件成为同义反复。可能会有一些聪明的位操作来检查可能的下溢,但使用ptrdiff_t
代替它会不会更简单?
解决这个问题的正确方法是什么? size_t
加上一点点or或ptrdiff_t
并对语义感到不舒服?
答案 0 :(得分:0)
向后循环应如下所示:
for (size_t i = 0; i != n; ++i) {
arr[n - i - 1] = foo();
}
如果愿意,n - i - 1
是与i
对应的“反向迭代器”。