【发布时间】:2016-06-04 20:49:01
【问题描述】:
当我使用带有uint64_t 的for 循环作为计数器时,它会永远卡住,即使条件似乎已经很好地定义了。
违反 MCVE
#include <stdio.h>
#include <inttypes.h>
int main() {
uint64_t i;
for (i = 15; i >= 0; i--) { printf("%"PRIu64" ", i); }
return 0;
}
部分输出
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
似乎它忽略了停止条件,所以它翻转了。
但是,当将其更改为“等效”while 循环时,一切正常:
正确的 MCVE
#include <stdio.h>
#include <inttypes.h>
int main() {
uint64_t i = 16;
while (i--) { printf("%"PRIu64" ", i); }
return 0;
}
完整输出
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
我是否遗漏了有关在 for 循环中使用 uint64_t 计数器的内容?非常感谢任何帮助!
【问题讨论】:
-
i >= 0对于无符号数始终为真。 -
在 i = 0 之后它会环绕到最大值,永远不会到 -1,所以停止表达式不会为假
-
如果使用 GCC,请始终使用
-Wall -Wextra进行编译,以获得此类问题的有用警告。如果使用 MSVC 编译,请使用-Wall。 -
i >= 0 永远为真,你可以把它改成 i != -1
-
等效的
while循环将是uint64_t i; i = 15; while (i>=0) { printf("%"PRIu64" ", i); i--; }。这也会显示一个无限循环,就像您的for循环一样。
标签: c for-loop while-loop uint64