以下代码使用Codeblocks将输出设为0 0 0 0。
int main()
{
static int i=5;
if(--i){
main();
printf("%d ",i);
}
}
我完全理解上面的代码是如何执行的。但是,当我删除静态'从代码和使用int i = 5,Ideone.com(在线编译器)给了我运行时错误和Codeblocks(使用GCC)没有给我任何 - 甚至终端没有弹出。
我也尝试将声明部分放在main之外,即static int i;在主要的,我然后给了i = 5;。不过,我收到了上述错误。我不知道发生了什么。任何帮助将不胜感激。
PS:该程序是在网站上找到的,没有给出任何解释。
答案 0 :(得分:4)
如果删除静态,每次调用main都会得到自己的i副本,初始化为5,所以你的递归永远不会终止。
答案 1 :(得分:1)
当您在static int i
之外声明main()
并在main()
内将其初始化为值5
时,执行时会出现问题。 if(4)
第一次调用你的内部main()
执行外部main()
,使i
设置回5
,使其无限循环,因此无输出你看,因为if
永远不会失败,只有一种可能性if(4)
。
int main() // 1st main call
{
static int i=5;
if(--i){ // if(4), if(3), if(2), if(1)-> all four if's are true
// if(0) fails
main(); // 2nd main, 3rd main, 4th main, 5th main -> corresponding to
// above successful if's.
// When if(0), recursion ends, return
printf("%d ",i); // Now i is `0` and prints 4 zero's
}
}
答案 2 :(得分:0)
如果删除static
,则在输出任何内容之前会得到无限递归。递归导致堆栈溢出,程序崩溃。
static
表示您始终对同一个变量进行操作,因此您可以从5开始计算 - > 0.如果删除它,则在每次调用5时初始化它,if(4)
始终为true。
使用static
时,它只会初始化一次。
答案 3 :(得分:0)
当使用静态printf时将显示4,3,2,1并且递归将结束。
当不使用静态时,理论上(如果程序会运行)printf将显示4,4,4,4 .. 递归永远不会结束。
答案 4 :(得分:0)
您的代码没有问题。 情况1: 如果你写,它会给你输出0000因为你正在递减i的值。一旦它变为0.如果条件为假,它将打印0次。
int main()
{
static int i=5;
if(--i){
main();
printf("%d ",i);
}
}
案例2:
但是如果删除静态,则在每次递归调用中都会创建一个新变量i,每次变量占用2个字节并消耗内存(在堆栈中)。一旦堆栈满了,它就会提示运行时错误并且程序将崩溃。 http://ideone.com的在线编译器 处理后端的运行时错误,这样你的程序就不会崩溃。这就是为什么你会遇到运行时错误。和预期的答案。
案例3:
当您将变量声明为
时static int i;
int main()
{
i=5;
if(--i){
main();
printf("%d ",i);
}
}
在这种情况下,它将再次超过内存限制。这里每次你分配5到i和main()将占用堆栈空间,再次程序崩溃。