C++函数内部声明的static静态变量运行行为是怎样的?
static局部变量的运行逻辑说明
这两个代码片段的表现差异完全符合C++的标准规则,核心区别在于变量的声明次数和static局部变量的初始化时机:
- 函数内部的static局部变量,初始化操作仅会在函数第一次被调用、执行到该声明语句时运行一次,后续所有函数调用都会跳过该初始化语句,变量的内存地址和值会在整个程序生命周期内保留,不会重新分配或赋值。
- 同一作用域内,相同变量名仅允许声明一次,重复声明会触发编译报错。
第一段代码可正常运行的原因
你写的insert函数内仅声明了一次static int jo,完全符合作用域声明规则:
- 第一次调用
insert(1)时,程序首次执行到static int jo = k;语句,完成静态变量jo的初始化,值为1,输出结果1。 - 第二次调用
insert(2)时,程序会直接跳过静态变量的初始化语句,不会重新给jo赋值,也不会为它开辟新的内存空间,jo仍然保留第一次初始化的1,因此输出还是1。
第二段代码报重定义错误的原因
你在main函数的同一个作用域内,连续两次声明了同名变量static int jo,违反了C++的单一定义规则,编译器在编译阶段就能识别到这个错误,直接抛出重定义提示,根本不会进入运行阶段。
这个报错和变量是否是static无关:哪怕你把两个声明前的static去掉,同一个作用域内两次定义int jo也会触发完全相同的报错。
内容的提问来源于stack exchange,提问作者user15071942
相关产品推荐
相关产品推荐

