C++中static静态变量为何呈现两种不同值:初始为5,调用函数后变为1?
为什么static变量count会呈现两种不同的值?
首先来看你提供的代码:
#include<stdio.h> static int count=5; int fun() { count = 0; count++; return count; } int main() { printf("%d ", count); printf("%d ", fun()); printf("%d ", fun()); printf("%d ", count); return 0; }
程序的输出结果是:
输出结果:5 1 1 1
你的问题是:
问题:为何count变量会呈现两种不同的值?初始值为5,调用函数后却变为1?
咱们一步步拆解这个问题,核心点在于static变量的特性,再加上你函数里的操作逻辑:
static全局变量的本质:你定义的
static int count=5是全局作用域的static变量,它的生命周期贯穿整个程序运行过程,而且只会被初始化一次(就是程序启动时设为5)。不过这里的关键不是它的持久化特性,而是你在函数里主动修改了它的值。程序执行的完整流程:
- 程序刚启动时,全局static变量
count被初始化为5,这时候还没有任何函数修改它。 - 第一个
printf直接输出count的当前值,也就是5——这是它的初始状态,还没被fun()触碰过。 - 第一次调用
fun():函数第一行就执行了count = 0;,直接把原来的5覆盖成0,紧接着count++让它变成1,然后返回这个值。这时候全局的count已经被改成1了。 - 第二次调用
fun():同样的逻辑,先把count重置为0,再加1变成1,返回1。哪怕count本来已经是1,这一步也会先把它打回0再递增,所以输出还是1。 - 最后一个
printf输出的是经过两次fun()修改后的count值,自然就是1。
- 程序刚启动时,全局static变量
为什么会出现“两种值”?
初始的5是count未被函数修改时的初始值,而调用fun()后,函数里的count = 0;直接覆盖了初始值,后续每次调用函数都会重复“重置为0→加1”的操作,所以之后的值全是1。如果把函数里的count = 0;删掉,你就能看到static变量“跨函数调用保持值”的特性:第一次调用fun()会让count从5变成6,第二次变成7,输出就会是5 6 7 7,这才是static变量持久化的典型表现。
说白了,不是static变量的特性导致了两种值,而是你在函数里主动重置了它的初始值,才出现了前后不同的结果~
内容的提问来源于stack exchange,提问作者Deepjyoti Das
相关产品推荐
相关产品推荐

