c++ 变量

旧街凉风 提交于 2020-02-05 19:05:52

c/c++中的变量

c++ primer这本书对变量的定义:

变量提供一个具名的,可供程序操作的存储空间。c++中的每个变量都有其数据类型,数据类型决定着变量所占内存空间大小和布局方式,该空间可以 存储值的范围,以及变量能参与的运算。

定义(definition)

首先是类型说明符,其后紧跟一个或多个变量名(标识符)组成的列表,变量名之间用逗号隔开,以逗号结尾。
标识符:字母,数字,下划线组成,以字母,下划线开头

int value = 0, i1, i2 = 0; //value,i1,i2的类型均为int,
                           // 其中value,i2的初始值为0 

初始化(initialized)

当变量在创建时获得一个特定的值,变量被初始化(initialized)了。

int i = 0;
int i = {0};
int i{0};
int i(0);//四种方式都可以实现将i初始化为0,
//也有区别,在将列表初始化的时候会重点说。

需要注意的是,虽然赋值操作和初始化都是使用‘=’来操作的,但却是两个截然不同的概念,初始化不是赋值,初始化是创建变量时的操作,而赋值的含义是把对象的当前值擦除,用一个新值来代替。在c++语言中,初始化是一个复杂的问题,很多初学者都忽略了这一点,很多难以察觉的神奇bug可能就是这么出现的。

默认初始化(default initialized)

定义在函数体的非静态内置类型的变量如果没有初始化,则其值是未定义的,由它的定义位置决定,定义在函数体外的内置类型变量被初始化为0.

定义在函数外的其实就是全局变量,相反则是局部变量,他们在内存中的存储位置不同,全局变量在全局存储区,局部变量在堆栈区,导致初始值不同。

变量的声明(declaration)

c++语言支持分离式编译(separate compilation),允许将程序拆分成多个文件进行独立编译,多个文件之间共享代码的方法就是声明与定义分离,变量只能定义一次,但是可以被多次声明,使用关键字extern进行声明(对全局变量才可以进行声明,也就是定义在函数体外的非静态变量)

//这是第一个文件
int i = 0 ;//声明并定义i

//这是第二个文件
extern int i;//声明i,此时i的值为0
extern int i = 6 ;//定义i,第二个文件的i为6
//如果在用extern 声明的同时又赋初始值,那么就是在重新定义变量i
int add(int X)
{
	extern i = 6;//错误
}
//如果在函数体内部试图初始化一个extern标记的变量,会报错

变量只能被定义一次,但是可以被多次声明

变量的生命周期(duration)与作用域( scope )

作用域与生命周期是两个完全不同的概念。在英文中,作用域用 scope 表示,生命周期则用 duration 表示。作用域是一个静态概念,只在编译源程序的时候用到。一个标识符的作用域指在源文件中该标识符能够独立地合法出现的区域。生命周期则是一个运行时概念,它是指一个变量在整个程序从载入到结束运行的过程中存在的时间周期。由于函数和数据类型是静态的概念,它们没有生命周期的说法,它们从编译、程序的运行到结束整个过程是一直存在的。

C++ 中作用域的级别由高到低,主要有文件域(全局作用域)、名字空间域、类域、函数作用域和代码块作用域,其中函数作用域和代码块作用域又统称为局部域。

变量类型 定义方法 生命周期 作用域 内存位置
全局变量 函数体外定义 程序运行期一直存在 全局作用域(全局变量只需在一个源文件中定义,就可以作用于所有的源文件) 全局/静态存储区
全局静态变量 static修饰 全局变量 程序运行期一直存在 文件作用域(只在被定义的文件中可见) 全局/静态存储区
局部变量 函数体内定义 程序运行出局部作用域即被销毁 局部作用域 栈区
局部静态变量 static修饰局部变量 程序运行期一直存在 局部作用域 全局/静态存储区

存储在全局/静态存储区的变量(全局变量,全局静态变量,静态变量)的初始值都为0

使用变量时的建议

  • 建议初始化每一个内置类型的变量,可以保证程序的安全
  • 当你第一次使用变量的时候再定义它。一般来说,在变量第一次被使用的地方附近定义它是比较好的选择:1、当其他人阅读代码时,可以很容易找到变量的定义。2、我们也可以给变量赋予一个比较合适的初始值。
  • 如果函数有可能用到某全局变量,则不宜再定义一个同名的局部变量,局部变量会覆盖全局变量。
  • 遵守变量命名规范(同样也是标识符的命名规范):
    1、变量名要体现实际含义。
    2、变量名一般用小写,如index ,不要使用Index或者INDEX。
    3、如果变量名由多个单词组成,单词之间要有明显区分,例如student_name或者studentName,而不是studentname。
    4、用户自定义的类名一般以大写字母开头。

参考资料

[1]C++ 作用域与生命周期 CSDN博主「Dablelv」的原创文章
[2]c++ primer(第五版)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!