我执行了这个程序,但无法理解为什么输出为“0”四次。谁能帮我理解它是如何工作的?我不明白为什么在条件失败时执行“printf”以及为什么它执行四次。
int main()
{
static int i=5;
if(--i)
{
main();
printf("%d ",i);
}
}
我执行了这个程序,但无法理解为什么输出为“0”四次。谁能帮我理解它是如何工作的?我不明白为什么在条件失败时执行“printf”以及为什么它执行四次。
int main()
{
static int i=5;
if(--i)
{
main();
printf("%d ",i);
}
}
您的 main 函数打印 4 次 0,因为 printf 语句发生在递归调用之后并且i
是一个静态变量。静态变量只初始化一次,并且在函数终止后不会被销毁,因为它没有分配到函数堆栈中。
结果,所i
使用的值printf
始终为 0,因为i
每次main
调用都会递减,并且printf
在最深的函数返回后执行第一个函数,因为i=0
.
为了更好地理解这个解决方案,让我们看一下堆栈调用:
main() i=5 (First call)
if(4) // True
main() (Second call)
if(3) // True
main() (Third call)
if(2) // True
main() (Forth call)
if(1) // True
main() (Fifth call)
if(0) //False End recursion No print because the condition is false
return
print(i) // 0 (Forth Call)
print(i) // 0 (Third call)
printf(i) // 0 (Second call)
print(i) // 0 (First call)
调用了 5 次,main
但应用程序打印了 4 个零,因为最后一次调用不打印任何内容,因为if
条件为假。
i
是静态的,所以它只初始化一次。每次调用main
它时i == 1
,` if语句条件将在此处为false时递减:
if(--i)
递归将停止并且i
将是0
,然后递归将展开并且程序将打印四个0
s。
为了完整起见,C99 标准草案第3段6.2.4
对象的存储持续时间说(强调我的):
使用外部或内部链接或存储类说明符 static声明其标识符的对象具有静态存储持续时间。它的生命周期是程序的整个执行过程,它的存储值只在程序启动之前初始化一次。