C中函数的静态variables
void foo() { static int x = 5; x++; printf("%d", x); } int main() { foo(); foo(); return 0; }
什么会打印出来? 6 6或6 7
为什么?
这里有两个问题,一生和范围。
variables的范围是可以看到variables名称的地方。 这里,x只在函数foo()中可见。
variables的生命周期是它存在的时期。 如果定义的x没有关键字static,则生命周期将从foo()的入口到foo()的返回。 所以每次通话都会重新初始化为5。
关键字static用于将variables的生存期延长到程序的生命周期; 例如,初始化只发生一次,然后variables保留它的值 – 不pipe它是什么时候 – 将来所有的调用foo()。
输出 :6 7
原因 :静态variables只初始化一次(不像自动variables),静态variables的进一步定义在运行时会被忽略。 如果不是手动初始化,则会自动初始化为值0。 所以,
void foo() { static int x = 5; // assigns value of 5 only once x++; printf("%d", x); } int main() { foo();// x = 6 foo();// x = 7 return 0; }
这与具有以下程序相同:
static int x = 5; void foo() { x++; printf("%d", x); } int main() { foo(); foo(); return 0; }
静态关键字在那个程序中所做的一切就是告诉编译器(本质上)“嘿,我在这里有一个variables,我不想别人访问,不要告诉别人它存在。
在一个方法里面,static关键字告诉编译器和上面一样,但是'不要告诉任何人这个函数以外的东西存在,只能在这个函数里面访问'。
我希望这有帮助
6 7
编译器安排每次input函数时都不会发生静态variables初始化
只要程序运行,函数内部的静态variables就会有一个使用期限。 每次你的函数被调用时,它都不会被分配,当你的函数返回时,它将被释放。
Vadiklk,
为什么…? 原因是静态variables只初始化一次,并在程序中保持其值。 意思是说,你可以在函数调用之间使用静态variables。 也可以用来计算“函数被调用的次数”
main() { static int var = 5; printf("%d ",var--); if(var) main(); }
和答案是5 4 3 2 1而不是5 5 5 5 5 5 ….(无限循环),你所期望的。 再次,原因是静态variables被初始化一次,当下一次调用main()时,它将不会被初始化为5,因为它已经在程序中初始化了。所以我们可以改变这个值,但是不能重新初始化。 这就是静态variables的工作原理。
或者你可以考虑每个存储:静态variables存储在程序的数据部分,存储在数据部分中的variables被初始化一次。 并在初始化之前将它们保存在BSS部分。
反过来,自动(本地)variables存储在堆栈上,堆栈上的所有variables都会在函数被调用时重新初始化,因为为此创build了新的FAR(函数激活logging)。
好的更多的理解,做上面的例子没有“静态”,让你知道会是什么输出。 这使你了解这两者之间的区别。
感谢贾维德
让我们来看看维基百科关于静态variables的文章 …
静态局部variables:在函数内声明为静态的variables是静态分配的,与自动局部variables具有相同的范围。 因此,当函数被再次调用时,函数在一次调用期间将静态局部variables放入的任何值仍然存在。
输出将是6 7
。 一个静态variables(不pipe是否在一个函数内部)都被初始化一次,然后执行该翻译单元中的任何函数。 之后,它保持其价值,直到修改。
你会得到6 7打印,因为容易testing,这是原因:当foo
第一次被调用时,静态variablesx被初始化为5.然后它增加到6并打印。
现在接下来给foo
打电话。 程序跳过静态variables初始化,而是使用上次分配给x的值6。 执行正常进行,给你的价值7。
6 7
x是仅从foo()可见的全局variables。 5是它的初始值,存储在代码的.data部分。 任何后续修改都会覆盖以前的值。 在函数体中没有生成任务代码。
6和7由于静态variables初始化只有一次,所以5 ++在第一次调用时变为6 6 ++在第二次调用时变为7注意 – 当第二次调用发生时,x值是6而不是5,因为x是静态variables。