You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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()

  1. 遇到static int i = 5;:这是第一次进入函数,执行初始化操作,把i设为5。划重点:这行代码之后再也不会执行了!
  2. printf("i is %d\n", ++i);:i先自增1变成6,输出i is 6
  3. i = 42;:把i的值改成42
  4. printf("i is %d\n", ++i);:i自增1变成43,输出i is 43
    此时函数执行完毕,但i作为static变量不会被销毁,当前值保留为43。

第二次调用func()

  1. 跳过static int i = 5;:因为已经完成过初始化,直接用上一次调用结束后留下的i值(43)
  2. printf("i is %d\n", ++i);:i自增1变成44,输出i is 44
  3. i = 42;:把i的值改成42
  4. printf("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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:19:35