全局变量、局部变量和静态变量

全局变量:定义在外部,程序范围内访问,如代码块1 ,全局变量在程序开始时初始化,结束时销毁。

局部变量:定义在函数内部,仅函数内部可访问,如代码块2 ,每次函数调用时初始化。

静态变量:在函数或类内用static定义,如代码块3 ,静态局部变量持续整个程序,而静态全局变量只在其定义文件内可见。

使用场景:
保存状态:静态局部变量,如代码块4 ,用于计数函数。

限制全局可见性:静态全局变量,如代码块5 ,类成员变量。

对比:
定义与范围:全局 > 静态 > 局部。

生命周期:全局/静态 > 局部。

可见性与封装:全局易变,局部/静态更安全。

实操提醒:尽量使用局部变量,必要时用静态变量保持状态,谨慎使用全局变量。

变量定义在函数内部还是函数之外?

说白了,变量定义位置直接决定可见范围,这事儿复杂在细节上容易踩坑。

先说最重要的:函数开头定义的变量,比如去年我们跑那个项目里int count = 0;,这玩意儿在整个函数里都能用,出了函数就作废。
另外一点,复合语句里定义的变量,比如{ int temp = 3 000; },这temp只在花括号里活,出了这个块就找不着了——这个点很多人没注意。
还有个细节挺关键的,函数外定义的变量,比如outside.h里int globalCount;,这货就像全局插件,文件里随便哪个函数都能用,但出了这个.c文件就歇菜了。

我一开始也以为外部变量到处都是,后来发现不对,它其实被限制在源文件内。
等等,还有个事,编译器看的是整个文件,所以别指望在不同文件里用同一个全局变量——那会编译报错。

建议你把函数内外变量区分开,别把局部变量拿去全局位置瞎用,这很坑。

函数运行结果是如何保存的?

听你这么一说,感觉挺复杂的。
我跟你讲讲我碰到的情况吧。

我之前在老家帮邻居修电脑,有个程序老是出问题。
他告诉我,说是函数里头存数据的方式不对。
你看啊,他那个程序,每次运行一个函数,里面定义了好多变量,修好了就返回个结果。
结果呢,过一会儿再让他修,那些变量又都重新定义了,之前修电脑的情况就没留记录。
你说这咋办?
后来我琢磨着,他是不是该用全局变量试试。
你看,我去年在一个小餐馆帮老板算账,他那个记账的小程序,就是用的全局变量。
每次结账,都往一个全局变量里头加钱,不管什么时候打开,都能看到上次的账。
虽然这样有时候会出点问题,比如两个人同时结账,数据就乱了,但他那会儿就不管这个,反正他主要就是看总账,不搞复杂的。

后来老板换了个系统,用了一个叫“闭包”的东西,我看说明书说挺高级的。
反正吧,那个函数能记住之前的状态,每次调用都能看到上次的记录。
不过这个我不太懂,没怎么弄明白。
反正后来老板说效果挺好,数据不会乱。

所以你看,这函数存数据,用局部变量吧,每次调用都重新开始,用全局变量吧,有时候会出问题,用闭包吧,我又没弄明白。
不过我倒是知道,不管用哪种方法,都得看具体情况,不能一概而论。
就像我修电脑,有时候用全局变量,有时候用闭包,得看电脑的具体情况。

总之,函数存数据这事儿,挺复杂的,得根据具体情况来定。
我这点经验,你参考参考吧。

什么叫外部变量内部变量(什么叫变量和不变量)

外部变量,全局范围,跨函数用。

内部变量,局部范围,函数内用。

常量,值不变,用const定义。

你自己掂量。