我第一次尝试反向for循环 n次做的事情是这样的:
for ( unsigned int i = n-1; i >= 0; i-- ) { ... }
这是失败的,因为无符号算术 i
保证总是大于或等于零,因此循环条件将始终为真.幸运的是,在我不得不想知道为什么循环无限执行之前,gcc编译器警告我"无意义的比较".
我正在寻找一种解决这个问题的优雅方法,请记住:
它应该是一个倒退的循环.
循环索引应该是无符号的.
n是无符号常数.
它不应该基于无符号整数的"模糊"环算术.
有任何想法吗?谢谢 :)
怎么样:
for (unsigned i = n ; i-- > 0 ; ) { // do stuff with i }
for ( unsigned int loopIndex = n; loopIndex > 0; --loopIndex ) { unsigned int i = loopIndex - 1; ... }
要么
for ( unsigned int loopIndex = 0; loopIndex < n; ++loopIndex ) { unsigned int i = n - loopIndex - 1; ... }
for ( unsigned int i = n; i != 0; i-- ) { // do something with i - 1 ... }
请注意,如果您使用C++以及C,那么在切换到使用迭代器时,使用!=是一个很好的习惯,其中<=等可能不可用.
为什么不简单:
unsigned int i = n; while(i--) { // use i }
这符合问题正文中列举的所有要求.它不会使用任何可能导致代码检查失败或违反编码标准的内容.我能看到的唯一反对意见是OP是否真的坚持for
循环而不是生成i =(n-1)... 0的简单方法.
for ( unsigned int i = n; i > 0; i-- ) { ... i-1 //wherever you've been using i }
我倾向于使用
for ( unsigned int i = n; i > 0; ) { --i; ... }
它与skizz的答案几乎相同,(它错过了最后的不必要的减量,但编译器应该优化它),实际上将通过代码审查.我必须使用的每个编码标准在条件规则中都没有变异.
也许这样?恕我直言,它清晰可读.如果以某种方式隐式知道if(n> = 1),则可以省略它.
if(n>=1) { // Start the loop at last index unsigned int i = n-1; do { // a plus: you can use i, not i-1 here } while( i-- != 0 ); }
另一个版本:
if(n>=1) { unsigned int i = n; do { i--; } while( i != 0 ); }
没有if语句的第一个代码如下所示:
unsigned int i = n-1; do { } while( i-- != 0 );