这是我的示例代码:
int main()
{
static int i = 5;
if(--i)
{
main();
printf("%d ",i);
}
}
为什么打印0 0 0 0
?为什么循环不是无限的?这个问题是从geeksforgeeks中提取的。
答案 0 :(得分:4)
main
将被自己调用4次,i
被重复递减。由于i
为static
,因此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条件,则循环仅在那里结束。