C 为什么在打印语法之前终止For循环后显示“Hello”需要更长的时间?
为什么在运行Hello之后,在控制台中打印Hello大约需要10秒钟 请注意,在For循环的末尾使用分号是有意的。因为减量i-将一直执行到无穷大,因为i<5永远不会满足,一旦迭代整数i达到整数可以容纳的最小值,即-2147483648溢出,它立即在负2147483648次迭代时退出循环 如果你这样写:C 为什么在打印语法之前终止For循环后显示“Hello”需要更长的时间?,c,for-loop,infinite-loop,C,For Loop,Infinite Loop,为什么在运行Hello之后,在控制台中打印Hello大约需要10秒钟 请注意,在For循环的末尾使用分号是有意的。因为减量i-将一直执行到无穷大,因为i=5,即使您一直在递减它。因为该行为是未定义的,所以可能需要数年的时间(如果有的话)。在你的问题中展示一些。这个答案说循环“显然”是一个未定义的行为,但问这个问题的人不清楚,这个答案没有说明原因。它根本没有提到发生的整数溢出。因此,它不包含问题的答案。此外,循环末尾的分号是有意的实验,而不是错误。 int i; long long j = 0;
#include <stdio.h>
int main(void) {
// single-line for-loop
for (int i = 0; i < 5; i--);
// delays to execute this syntax
printf("Hello\n");
return 0;
}
然后,您将实际了解循环退出的迭代,以及在该循环之后获得一些时间打印Hello的原因。我已经找到了发生这种情况的方式和原因。。 这是因为int数据类型的范围是从-2147483648到2147483647。由于i-,这个for循环中的i从0变为-2147483648;之后,由于数据类型范围和数据溢出的限制,i的值变为2147483647,因此使条件i 我们对您的C实现一无所知。 有关C语言的更多信息,请参阅及更高版本的C11标准。同时阅读 我猜想您在x86-64计算机上使用了最新的编译器。我建议您阅读GCC的文档。您可能还需要阅读您的,所以在我的Linux计算机上的文档 如果确实是这样,我建议启用所有警告和调试信息,因此使用gcc-Wall-Wextra-g编译代码。您可能会收到一些警告 你在减少i。假设int是32位。然后在第一个循环中,i是0;在第二个循环中,我变成-1。。。。你的电脑可能会循环231次。大约20亿个循环 计算机很快,但不是无限快。 我的建议是:学习使用调试器,例如 最后给出了缓冲输入输出。因此,学习使用和阅读的文件,当然 我不知道你怎么会在10秒钟后打招呼!仔细看看for循环。它实际上永远不会结束,因为i值不断减小,因此它将始终小于5。所以我想这个过程已经结束了 现在不要认为仅仅因为在for循环后添加了分号for循环就不会运行。它将运行。循环将发生,只是没有代码可执行。分号将被编译器视为空语句。一旦条件返回false,编译器将继续执行下一个语句
请检查代码是否正确。我非常怀疑它是++I而不是-I您可以在for循环中打印ii的值来查看发生了什么,例如,fori=0;我知道,在示例代码中,printf调用不在for循环内吗?整数溢出在C中是未定义的行为,在这里它是下溢的,出于某种原因,它最终>=5,即使您一直在递减它。因为该行为是未定义的,所以可能需要数年的时间(如果有的话)。在你的问题中展示一些。这个答案说循环“显然”是一个未定义的行为,但问这个问题的人不清楚,这个答案没有说明原因。它根本没有提到发生的整数溢出。因此,它不包含问题的答案。此外,循环末尾的分号是有意的实验,而不是错误。
int i;
long long j = 0; // intentionally using to hold lesser than the value
// and integer could hold for debugging test
for(i = 0; i < 5; i--)
j = i;
printf("%d\n", j);
int i;
for(i=0;i<5;i--);
for(i=0;i<5;i--);