我们需要以相反的顺序打印大小为int
的{{1}}数组:
N
使用// Wrong, i is unsigned and always >= 0:
for(size_t i = N-1; i >= 0; --i){cout << data[i];}
// Correct, but uses int instead of size_t:
for(int i = N-1; i >= 0; --i){cout << data[i];}
// Correct, but requires additional operation in the loop:
for(size_t i = N; i > 0; --i){cout << data[i-1];}
// Probably the best version, but less readable.
// Is this well-defined behavior?
for(size_t i = N-1; i != (size_t)(-1); --i){cout << data[i];}
索引进行此类枚举是否有更好的方法,并且循环中没有其他操作?
假设size_t
给出(size_t)0 - 1
或者这是未定义的,是否有效?
答案 0 :(得分:2)
自C ++ 14:
for (auto it = std::rbegin(data); it != std::rend(data); ++it) { std::cout << *it; }
或者,如果您可以使用提升,则可以使用boost::adaptors::reversed
和范围。
答案 1 :(得分:2)
您可以将减量移动到“条件”之后。
for(size_t i = N; i > 0;) {
--i;
cout << data[i];
}
它不像转发循环那样优雅,但它有效。我们在0处突破,因此i
永远不会包裹。
答案 2 :(得分:1)
您只需测试i < N
。
size_t被定义为无符号整数,而后者又被定义为具有模数语义。因此,您的索引将从N-1
降低到0,然后回绕到numeric_limits<size_t>::max()
i<N
不再适用。
举一个完整的例子:
for(size_t i = N-1; i < N; --i){cout << data[i];}