0
#include<stdio.h>
main()
{
    static int i=1;
    printf("\nSoftware");                                                                   
    for(;i<5;i++)
        main();
    return 0;
}

输出结果是一个无限循环。请解释。

4

9 回答 9

3

您正在从主函数调用主函数。调用新的主函数后,它会打印一些字符串,然后再次调用函数。

您的i变量根本不会增加,因为它不会在 for 循环的第一次迭代中增加。在你调用main之后,它永远不会返回到前一个 main 到 for 循环的下一次迭代发生。所以循环将是无限的,i将等于1。即使您将 for 循环更改为任何其他循环,循环仍将是无限的。

我将您修复的代码包括在内,只是为了好玩:

#include<stdio.h>

int main()
{
    static int i=0;
    if(i>=5) return 0;
    i++;
    printf("\nSoftware %i", i);
    main();
    return 0;
}
于 2013-07-22T10:37:40.963 回答
1

这不是一个无限循环。

您正在递归调用main,但永远不会结束它。这会导致堆栈溢出。

i++永远不会被评估,因为你永远不会到达for循环的结束。

于 2013-07-22T10:41:54.710 回答
1

当 Loop 的一次迭代完成时,i的值会增加。但是在您的情况下,在增量之前它再次调用main()函数。因此,您的代码处于无限循环中。

于 2013-07-22T10:41:27.217 回答
1

这似乎没有什么困难或不同。在这个程序中 for 循环无关紧要,所以每当在同一个内部调用 main() 时,它肯定是一个无限循环。使用条件语句可以限制无限循环环形。此外,静态 int 根本无关紧要。所以显然 main 会被无限次调用,直到发生超时。这实际上是不言自明的

于 2013-07-22T10:44:42.403 回答
1

在循环中调用 main 函数会占用所有内存并导致堆栈溢出。

于 2013-07-22T10:54:21.153 回答
1

是的,输出肯定是无限的,因为for(;i<5;i++)增量i仅发生在 for 循环的最后一行。所以,这里的值i从不增加。例如:

for(i=0;i<5;i++)
{
int a,b; // just an example
a=10;
b=20;
printf("%d",i);
printf("%d %d",a,b);
// increment of i takes place here at the last line of for loop
}

也和这里一样:

main()
{
    static int i=1;
    printf("\nSoftware");                                                                   
    for(;i<5;i++)
    {    
    main();
    // increment of i takes place here.But compiler never comes at this line .That's why i never incremented .
   }
   return 0;
}
于 2013-07-22T11:04:51.123 回答
0

代码调用main函数,一次又一次

for(;i<5;i++)
main();
于 2013-07-22T10:38:33.183 回答
0

它是一种递归调用。您的主要功能正在调用自身,从而导致无限循环。

于 2013-07-22T10:40:11.117 回答
0

i<5 调用 main()
i<5 调用 main()
i<5 调用 main()
...

如果你想调用某个函数 5 次。

包括

void myFunc()
{
   printf("\nSoftware"); 
}

main()
{
    static int i=1;                                                                
    for(;i<5;i++)
        myFunc();
    return 0;
}

我习惯了 C++,所以这可能是一个小错误。

于 2013-07-22T10:41:21.720 回答