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