1. 变量
1.1 变量的定义
- 变量:是值可以改变的量;
- 变量:是存储信息的地方,是内存中的地址,在这个地址中可以进行数据的存储和读取;
注:变量提供一个具名的、可供程序操作的存储空间。C++中的每个变量都有其数据类型,数据类型决定着变量所占内存空间的大小和布局方式、该空间能存储的值的范围,以及变量能参与的运算。
1.2 变量的命名规则
- 名称中只能使用数字、字母、下划线、大小写字母代表不同字符;
- 名称的第一个字符不能为数字,可以为下划线或字母;
- 在相同作用域不能声明两个变量名相同的变量;
- 不能使用C++关键字用作名称;
- 变量名的长度不得超过255个字符;
1.3 变量的初始化与赋值的区别
- 初始化:赋值操作是与定义变量同步执行的,初始化的含义是创建变量时赋予其一个初始值,如:
int a = 1; - 赋值:赋值操作是在定义变量之后执行的,赋值的含义是把变量的当前值擦除,而以一个新值来替代,如:
int a;
a = 1;
a = 2;
1.4 变量的默认初始化
- 如果是内置类型的变量未被显式初始化,它的值由定义的位置决定。
(1)定义于任何函数体之外的变量被初始化为0;
(2)定义在函数体内部的内置类型变量将不被初始化,一个为被初始化的内置类型变量的值是未定义的,如果试图拷贝或以其他形式方位此类值将引发错误,类的对象如果没有显式地初始化,则其值由类确定; 错误代码示例:函数体内部的内置类型int变量,若未被初始化,则该值是未定义的。
#include <iostream> #include <string> using namespace std; int global_int;//函数体外的内置类型int变量,被默认初始化 int main() { int local_int;//函数体内部的内置类型int变量,未被初始化 string local_string;//类的对象未被初始化,其值由类确定 cout<<"global_int = "<<global_int<<endl; cout<<"local_int = " <<local_int<<endl; cout<<"local_string = "<<"\""<<local_string<<"\""<<endl; system("pause"); return 0; } =>编译警告:warning C4700: 使用了未初始化的局部变量“local_int” 输出global_int = 0之后 运行程序崩溃报错:Run-Time Check Failure #3 - The variable 'local_int' is being used without being initialized.
正确代码示例:初始化函数体内部的内置类型int变量,才是正确的处理。
#include <iostream> #include <string> using namespace std; int global_int;//函数体外的内置类型int变量,被默认初始化 int main() { int local_int = 0;//初始化函数体内部的内置类型int变量 string local_string;//类的对象未被初始化,其值由类确定 cout<<"global_int = "<<global_int<<endl; cout<<"local_int = "<<local_int<<endl; cout<<"local_string = "<<"\""<<local_string<<"\""<<endl; system("pause"); return 0; } =>global_int = 0 local_int = 0 local_string = ""
注:建议初始化每一个内置类型的变量。未初始化的变量含有一个不确定的值,使用未初始化变量的值是一种错误的编程行为并且很难调试。
1.5 变量的声明和定义
- 声明:使得名字为程序所知,一个文件如果想使用别处定义的名字则必须包含对那个名字的声明;
- 定义:负责创建与名字关联的实体;
声明变量:仅规定了变量的类型和名字。如果想声明一个变量而非定义它,就在变量名前添加关键字extern,而且不要显式地初始化变量;
(1)extern int i; //声明i,而非定义i (2)int j; //声明j,并定义j
定义变量:规定了变量的类型和名字,还申请存储空间,也可能会为变量赋一个初始值。任何包含了显示初始化的声明即成为定义;
(1)extern int i = 0; //声明i,并定义i (2)int j = 0; //声明j,并定义j (3)int j; //声明j,并定义j
注:变量能且只能被定义一次,但是可以被多次声明。如果要在多个文件中使用同一个变量,就必须将声明和定义分离,此时,变量的定义必须出现在且只能出现在一个文件中,而其他用到该变量的文件必须对其进行声明,却绝不能重复定义。
1.6 变量的定义与赋值
- 定义变量:在定义了变量后,系统便为这个变量名分配一个内存地址,这样当我们为该变量赋值的时候,数值便会通过这个地址写入到内存中,而当程序需要取变量的值时,可以通过这个地址或变量名读数据。
- 赋值,存储到计算机内存中:可以看作是一系列排列整齐的小文件柜,每个文件柜有许多排成一列的小格子组成,每个格子都编了号,这些编号就是内存地址,变量一般放置在一个或多个格子内,每个格子都可以存储一个值。每个格子代表1个字节,如果定义的变量类型是int,那么它需要4个字节的空间,也就是4个格子。变量名是贴在这些文件柜上的一个标签,用户可以通过变量名,无需知道变量的具体地址就可方便地查找到变量。
注:
(1)当我们定义了一个变量时,必须告诉编译器该变量是什么类型(整型、字符型、其他类型),编译器将根据定义的类型自动为变量预留空间,然后做好放置该种类型的值的准备。
(2)RAM:随机存取存储器,即内存。
1.7 变量名的作用域
作用域:是程序的一部分,在其中名字有其特定的含义。C++中大多数作用域都以花括号分隔。
#include <iostream> #include <string> using namespace std; int reused_int = 26; int main() { int unique_int = 0; cout<<"reused_int = "<<reused_int<<"\t"<<"unique_int = "<<unique_int<<endl; int reused_int = 0;//定义一个同名的局部变量 cout<<"reused_int = "<<reused_int<<"\t"<<"unique_int = "<<unique_int<<endl; cout<<"::reused_int = "<<::reused_int<<"\t"<<"unique_int = "<<unique_int<<endl; system("pause"); return 0; } =>reused_int = 26 unique_int = 0 reused_int = 0 unique_int = 0 ::reused_int = 26 unique_int = 0
注:如果函数有可能用到某全局变量,则不宜再定义一个同名的局部变量。
参考文献:
[1]《C++全方位学习》范磊——第四章
[2]《C++程序设计教程(第二版)》钱能——第二章
[3]《C++Primer(中文版)》王刚 杨巨峰——第二章
[4] 百度搜索关键字:C++变量、变量的命名规则、变量的初始化与赋值、变量的默认初始值、变量的声明和定义、变量与内存、变量名的作用域