【发布时间】:2015-01-29 05:30:50
【问题描述】:
假设我们需要以相反的顺序打印大小为N 的int 数组:
// 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 给出(size_t)(-1) 是否有效或者这是未定义的?
【问题讨论】:
-
如果我知道我将至少迭代一次然后我使用
do/while。否则我倾向于从一开始计算并使用data[i - 1]。 -
为什么在迭代器上“使用
size_t索引”? -
我建议更改代码以便在循环中使用索引。因为我认为这是一个有效的问题,所以通常你确实需要索引。否则,你会因为使用迭代器或类似工具的有效建议而偏离真正的问题。
-
@ChrisDrew:是的,我可以通过用 C 语言标记这个问题并将代码更改为 C 来防止这种侧向跟踪。但现在为时已晚。