C 为什么在打印语法之前终止For循环后显示“Hello”需要更长的时间?

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;

为什么在运行Hello之后,在控制台中打印Hello大约需要10秒钟

请注意,在For循环的末尾使用分号是有意的。

因为减量i-将一直执行到无穷大,因为i<5永远不会满足,一旦迭代整数i达到整数可以容纳的最小值,即-2147483648溢出,它立即在负2147483648次迭代时退出循环

如果你这样写:

#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--);