为什么循环在下面的例子中没有运行无限?

时间:2016-02-15 08:47:51

标签: c

这是我的示例代码:

int main()
{
    static int i = 5;
    if(--i)
    {
        main();
        printf("%d ",i);
    }   
}

为什么打印0 0 0 0?为什么循环不是无限的?这个问题是从geeksforgeeks中提取的。

3 个答案:

答案 0 :(得分:4)

main将被自己调用4次,i被重复递减。由于istatic,因此i的所有调用都使用相同的main

在递归被阻止之前,没有任何内容输出到控制台。到那时i为零。

顺便说一下,main调用自身的行为在C ++中是 undefined ,尽管在​​C中它是允许的。如果您正在使用C ++编译器,请确保将编译器标志切换为C.

答案 1 :(得分:3)

您的if(--i)获取if(0),此评估为false并存在该程序。静态变量在声明后不会重新初始化。正如@Himanshu所提到的,删除static关键字将导致无限循环,因为i将始终具有等于5的值。

保持程序原样,i将减少到0并停止循环。 main()函数只调用自身,当i == 0时,它会停止递归并打印堆栈。

答案 2 :(得分:0)

在编译期间在数据段中创建静态变量。虽然运行时更新了静态变量的实例(在数据段中创建),但是在每次递归调用时都会在堆栈段上反复创建变量 $(document).ready(function() { var p; $("#trigger").change(function() { if (this.checked) { $('#mydiv').prepend(p); p = null; } else { p = $("p").detach(); } }); });

所以,当每个 p { background: yellow; margin: 6px 0; } p.off { background: black; }函数返回时,我在数据段上创建的同一个变量由 <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>detach demo</title> <link href="style.css" rel="stylesheet" /> <script src="https://code.jquery.com/jquery-1.10.2.js"></script> </head> <body> <div id="mydiv"> <p>Hello</p> <p>you?</p> </div> Toggle: <input type="checkbox" name="mycheckbox" id="trigger" checked/> <script src="script.js"></script> </body> </html>语句引用,由于之前的操作,该语句已经递减为0。

现在,回到第二个问题,如果(0)评估为false条件,则循环仅在那里结束。