变量的生存期和作用域是个很基础但又很重要的问题,所以我打算写几百字重温一下。
变量的生存期是指变量在什么时间段存在。
变量的作用域是指变量在哪些代码块中能够被访问。
一般来说变量生存期包含作用域。即在变量起作用的代码段,这时变量已经分配了存储空间。
也就是说,变量可能已经分配存储空间,但它不能被访问。
在程序加载到内存中时,有些变量就已经分配存储空间,并且这个存储空间直到整个程序执行完毕,从内存中退出时才会被释放。
这些变量的生存周期就为整个程序的生存周期。如 全局变量和静态局部变量。它们的差别是全部变量的作用域一般为定义处到它所在文件结束。
要在全局变量定义位置之前或其他源文件中引用该全局变量,需要用extern来扩展该全局变量的作用域。
程序中有的变量在程序加载到内存中时并不分配存储空间,而是到定义它的函数被调用执行时才会临时分配存储空间,并且一旦该函数执行完毕返回到被调用处,这些变量的存储空间会被回收。
如 非静态局部或自动变量。
一个局部变量,如果没有用static修饰则自动为auto,即这种情况下生存期为函数调用到函数返回这个时间段。
对于非静态局部变量,生存期和作用域都为其所在定义的函数
对于静态局部变量,它的生存期是整个程序生命周期,但作用域依旧为定义它的函数内部
全局变量与静态局部变量如果未初始化,值为0
非静态局部变量未初始化,值不定。
1. 一般情况下全局变量定义函数外,局部变量定义函数内;全局变量作用范围是全局,局部变量作用范围在函数内;
2. 静态变量定义在函数外,则为静态全局变量,作用范围为当前文件;定义在函数内,则为局部静态变量,作用范围同局部变量;
3. 如果在全局范围要经常用到某个值,则设置为静态变量,否则定义为普通全局变量即可;
4. c、c++和java可以定义静态变量,go和python不能定义静态变量;