log*_*ter 4 c for-loop while-loop uint64
当我使用for带有uint64_t作为计数器的循环时,它会永远被卡住,即使条件似乎已经明确定义.
攻击MCVE
#include <stdio.h>
#include <inttypes.h>
int main() {
uint64_t i;
for (i = 15; i >= 0; i--) { printf("%"PRIu64" ", i); }
return 0;
}
Run Code Online (Sandbox Code Playgroud)
部分输出
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 18446744073709551615 18446744073709551614 18446744073709551613 18446744073709551612 18446744073709551611 18446744073709551610 18446744073709551609 18446744073709551608 18446744073709551607 18446744073709551606 18446744073709551605 18446744073709551604 18446744073709551603 18446744073709551602 18446744073709551601 18446744073709551600 18446744073709551599 18446744073709551598 18446744073709551597 18446744073709551596 18446744073709551595 18446744073709551594 18446744073709551593 18446744073709551592 18446744073709551591 18446744073709551590 18446744073709551589 18446744073709551588 18446744073709551587 18446744073709551586 18446744073709551585 18446744073709551584 18446744073709551583 18446744073709551582 18446744073709551581 18446744073709551580 18446744073709551579 18446744073709551578 18446744073709551577 18446744073709551576 18446744073709551575 18446744073709551574 18446744073709551573 18446744073709551572 18446744073709551571 18446744073709551570
Run Code Online (Sandbox Code Playgroud)
它似乎忽略了停止条件,所以它翻了过来.
但是,当将其更改为"等效" while循环时,一切正常:
纠正MCVE
#include <stdio.h>
#include <inttypes.h>
int main() {
uint64_t i = 16;
while (i--) { printf("%"PRIu64" ", i); }
return 0;
}
Run Code Online (Sandbox Code Playgroud)
完成输出
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Run Code Online (Sandbox Code Playgroud)
我错过了关于uint64_t在for循环中使用计数器的事情吗?任何帮助是极大的赞赏!
i >= 0如果i是无符号类型,则条件为真.递减无符号零将不会产生负值,但计数器将换行为给定类型的最大可表示数.
C表示具有包含下限和排他上限的范围.例如,N元素数组的索引为0到N - 1.上限本身不是有效的数组索引.
此约定意味着您在递增之前使用值,但在使用之前将其除去.考虑一个简单的堆栈:
stack[nstack++] = x; // push a value
x = stack[--nstack]; // pop a value
Run Code Online (Sandbox Code Playgroud)
循环使用相同的逻辑:向前移动时,在递增之前使用该值:
for (var i = 0; i < N; i++) { use(i); }
Run Code Online (Sandbox Code Playgroud)
向后移动时,先减小然后再使用它:
for (var i = N; i-- > 0; ) { use(i); }
Run Code Online (Sandbox Code Playgroud)
这个循环相当于你的while.处理主体后发生的更新部分在此处为空.在进入循环之前对值进行检查; 循环体具有更新的值.
使用空更新部分时,此向后循环可能看起来很尴尬,但在其他方面,它与正向版本正交:
N - 1;| 归档时间: |
|
| 查看次数: |
483 次 |
| 最近记录: |