ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
>[info]# 变量 ## **类型** - 普通局部变量 - 普通全局变量 - 静态全局变量 - 静态局部变量 ## **局部变量的生命期:** - 在一个函数内部定义的变量是局部变量,它只在本函数范围内有效; - 在复合语句中定义的变量也是局部变量,它只在本复合语句范围内有效. ## **普通局部变量** 定义时若未赋初值,则该变量的值是不确定的,该不确定值的大小,取决于上一个被分配到该空间的变量的值 该值就是**随机值** ## **静态局部变量** 其生命周期很长,从被创建开始到程序结束 在一个项目中,一个文件无法从另一个文件中引用静态变量。 ### **例子** ``` // 计算阶乘 #include <iostream> using namespace std; long fac(int n) { static long f=1L; //静态局部变量 f*=n; return f; } int main() { for(int i=1;i<=5;i++) { cout<<i<<"!="<<fac(i)<<endl; } return 0; } ``` fac这个函数会被调用多次,每次调用都会分配空间,每次调用结束都会回收空间,所以该函数在程序运行过程中会被分配五次空间,被收回五次空间 static long f f是静态局部变量,f被分配的空间在数据区(data)中,该语句只会在第一次运行时调用,每次该函数运行结束,f都会被重新赋值,以此达到计算阶乘的目的。 ## **分配空间** 编译器为变量**分配空间**的过程就是建立变量名与空间地址的联系。 编译器**回收空间**就是断开地址与变量名之间的关系,但是不会回收该空间中的值。 ## **变量可见性** 描述的是标识符在某一位置的有效性; 标识符的可见性范围不超过作用域,即作用域包含可见范围; 在不发生同名标识符作用域重叠(即隐藏可见性)的情况下,二者可以打等号. 如果被隐藏的是全局变量,则可用符号::来引用该全局变量. ### **例子** ``` #include <iostream> using namespace std; int id=3; int main() { int id=5; { int id; id=7; cout <<"id=" <<id <<endl; //输出7 } cout <<"id=" <<id <<endl; //输出5 return 0; } ```