【发布时间】:2018-01-08 18:55:07
【问题描述】:
所以当我在印度准备入学考试时,我偶然发现了这段 C 代码
#include <stdio.h>
int main(void) {
static int i = 4;
if (--i) {
main();
printf("%d", i);
}
}
我认为printf 语句永远不会被执行并且输出将是空白的。
但我看到答案是0000,这是由于static 关键字和int 造成的。
谁能解释为什么 printf 会执行或者那个人错了?
【问题讨论】:
-
调用
main会导致未定义的行为,至少在 C++ 中是这样。如果需要,此代码可能会使您的机器着火。 -
我删除了 C++ 标签,因为您的代码是 C++ 或 C。并且由于您的代码使用
printf,而您说它是 C,因此 C++ 标签是错了。 -
在C中是允许的
-
if (--i)在测试前递减 i,如果 i 不为零,则进入块内并调用main,这在 C 中是合法的。进入第二个(以及随后的每个时间)main ,静态变量 i 没有重新初始化。所以,第二次真的是3。一旦 i 一直递减到零,if 测试返回 false,并且块被跳过并且最深递归的 main 返回。这就是每个printf语句被执行的时候。 -
与Unexpected output of the
main()function by repeated calls 非常相似。打印不一样,而且还打印了一个额外的局部变量,但是……