【发布时间】:2014-02-03 22:23:03
【问题描述】:
我偶然发现了这段 C 代码:
main(){
static int i=0;
i++;
if(i<=5){
int i = 3;
printf(" %d",i);
main();
}
}
1. 首先,我预计这段代码会出现编译错误,因为变量i 有多个定义。但是,它编译并运行成功并给出了这个输出。
3 3 3 3 3
2. 观察输出,3 被打印了 5 次,这意味着循环从 0 到 5 计数,因此意味着对于 if 条件,使用了i 的第一个定义(静态)。
3 但是,正在打印的值是 3,这是 i 的第二个定义。
所以变量标签i 指的是内存中的两个不同实例。一个用作循环计数,进行增量,另一个是正在打印的值。
我能以某种方式解释这一点的唯一方法是:
int i = 3(第二个定义)在每个递归调用中重复。 那个i的实例是在函数被调用时创建的,并在下一次递归调用时被杀死。 (因为静态范围)。printf使用 this 实例,因为它是最新定义(?)当进入一个新的递归级别时,
i++正在完成。由于没有其他方法可以解决这个i,它使用i的静态“实例”,它在代码中仍然是“活动的”,因为它被定义为静态。
但是,我无法确切说明它是如何工作的。任何人都可以解释这里发生了什么,在代码和内存中吗?
这里的编译器是如何进行变量绑定的?
【问题讨论】:
-
你没有
while循环... -
@user3156863 感谢您指出该错误。更正了问题。