为何static修饰的变量在函数多次调用时输出不一致?
嘿,我来帮你把这段C++代码的输出逻辑掰明白,再对比下你熟悉的Java static,你就能清楚两者的差异啦!
先看代码与对应输出
先把你的代码和实际输出对应上:
// Example program #include <iostream> #include <string> #include <cstdio> void func() { static int i = 5; printf("i is %d\n", ++i); i = 42; printf("i is %d\n", ++i); } int main() { puts("this is main()"); func(); func(); return 0; }
实际输出:
this is main() i is 6 i is 43 i is 44 i is 43
核心关键点:C++局部static变量的特性
你熟悉的Java static是类级别的共享变量,但C++里定义在函数内部的static变量有个特殊规则:
它只会在第一次进入函数时初始化一次,之后每次调用函数都会直接复用这个变量的当前值,而且它的生命周期和整个程序一样长,不会因为函数执行完毕就被销毁。
逐次拆解func()的调用过程
我们分两次调用func()来一步步梳理:
第一次调用func()
- 遇到
static int i = 5;:这是第一次进入函数,执行初始化操作,把i设为5。划重点:这行代码之后再也不会执行了! printf("i is %d\n", ++i);:i先自增1变成6,输出i is 6i = 42;:把i的值改成42printf("i is %d\n", ++i);:i自增1变成43,输出i is 43
此时函数执行完毕,但i作为static变量不会被销毁,当前值保留为43。
第二次调用func()
- 跳过
static int i = 5;:因为已经完成过初始化,直接用上一次调用结束后留下的i值(43) printf("i is %d\n", ++i);:i自增1变成44,输出i is 44i = 42;:把i的值改成42printf("i is %d\n", ++i);:i自增1变成43,输出i is 43
函数执行完毕,i的值仍保留为43,直到整个程序结束才会被销毁。
和Java static的差异对比
你熟悉的Java static:
- 属于类的成员,所有该类的实例共享同一个变量,初始化时机是类加载阶段
- Java不允许在函数内部定义static变量
而C++的局部static:
- 属于函数本身,仅在第一次调用函数时初始化,后续调用直接复用当前值
- 生命周期贯穿整个程序,只要被初始化过一次,就会一直存在内存中
这样对比下来,你应该就能完全理解这段C++代码的输出逻辑啦!
内容的提问来源于stack exchange,提问作者NellMartinez
相关产品推荐
相关产品推荐

