为什么输出是0000以及如何?
我执行了这个程序,无法理解为什么输出为“0”四次。 任何人都可以帮我理解它的工作原理吗? 我不明白为什么“printf”在条件失败时执行以及为什么执行四次。
int main() { static int i=5; if(--i) { main(); printf("%d ",i); } }
您的main函数打印4次0,因为printf语句在递归调用之后发生,并且i
是静态变量。 静态变量只初始化一次,并且在函数终止后不会被销毁,因为它没有被分配到函数堆栈中。
结果, printf
使用的i
的值总是为0,因为每次调用main
i
递减,并且在最深函数返回后执行第一个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)
main
被调用5次,但应用程序打印4个零,因为最后一次调用不会打印任何内容,因为if
条件为false。
i
是静态的,所以它只被初始化一次。 每当你调用main
它会在i == 1
时递减,那么` if语句条件在这里将为false :
if(--i)
递归将停止, i
将为0
,然后递归将展开,程序将打印四个0
秒。
为完整起见,C99标准草案第6.2.4
节对象第3段的储存期限说明( 强调我的 ):
标识符使用外部或内部链接声明的对象,或者使用存储类说明符static声明的对象具有静态存储持续时间。 它的生命周期是程序的整个执行,它的存储值只在程序启动之前初始化一次 。