为什么C中的无限循环无限循环?

j10*_*j10 -1 c infinite-loop

我在'C'程序下运行,它有一个无限循环.我看到CPU使用'top'命令达到了近99%.然后突然程序停止了.我很想知道系统中的规则是什么导致它停止.

我在阿尔卑斯山的码头图像下运行:3.1(+一些模块)我只是简单地开始它的灰烬(阿尔卑斯山的狂欢).
另外,我找不到ulimit.

#include <stdio.h>
int main() {
    int marks[10],i,n,sum=0;
    printf("Enter number of students: ");
    scanf("%d",&n);
    for(i = 0; i < n; --i) {
        //printf("Enter marks of student%d: ",i+1);
        int c;
        c = 5;
        int a;
        a = c;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*itt 10

正如你所提到的,你可以期待这产生一个无限循环,至少如果n是积极的话.

你所看到的行为是由你的计数器缠绕造成的:当它到达时INT_MIN,结果--iINT_MAX(至少,在英特尔式CPU上使用GCC的默认设置 - 这在C中没有定义,见下文)并且i<n失败.

因此,您的程序使用100%的一个CPU,而从0开始倒计时INT_MIN,然后回绕INT_MAX并停止.

你可以加

printf("%d\n", i);
Run Code Online (Sandbox Code Playgroud)

就在该return行之前,查看i循环退出时的值.

请注意,这是C中的未定义行为 ...如果您使用-O2,至少使用GCC 5.3 编译它,程序永远不会退出循环,因为优化器决定永远不会达到退出条件,并将循环编译为紧无限循环如果n是正(.L4: jmp .L4).