作用域是程序的一个区域,一般来说有三个地方可以定义变量:
1、在函数或一个代码块内部声明的变量,称为局部变量。
2、在函数参数的定义中声明的变量,称为形式参数,简称形参。
3、在所有函数外部声明的变量,称为全局变量。
我会在之后说到函数的时候介绍形参,所以这里仅介绍局部变量和全局变量的定义。
局部变量:
在函数或一个代码块内部声明的变量,称为局部变量。它们只能被函数内部或者代码块内部的语句使用。
void variable_scope()
{
//初始化局部变量a,b
//a,b只可以在当前函数,variable_scope中使用,其他函数中可以重新定义这两个变量
int a = 10,b = 20;
cout << a + b << endl;
if (a == 10)
{
int i = 1;
cout << i << endl;
++i;
}
//cout << i << endl;//error: 'i' was not declared in this scope
}
全局变量:
在所有函数外部定义的变量(通常是在程序的头部),称为全局变量。全局变量的值在程序的整个生命周期内都是有效的。
全局变量可以被任何函数访问。也就是说,全局变量一旦声明,在整个程序中都是可用的。
//定义全局变量j
int j = 9;
void variable_scope()
{
cout << j << endl;
if (a == 10)
{
++j;
cout << j << endl;
}
}
全局变量从定义处开始至程序结束起作用,即全局变量存在有效作用域。
如果你的全局变量定义在cpp文件的末尾,那你在这个cpp文件中是无法使用定义的全局变量,这是代码的执行顺序决定的。代码的执行是由上而下的,全局变量被定义在末尾,则编译器是无法检测出在定义之前调用的此全局变量的。
void variables()
{
h = 33;//error: 'h' was not declared in this scope
cout << h << endl;
return ;
}
int h = 0;
你可以对此全局变量进行声明,从而将全局变量的定义写在代码文件的末尾。
void variables()
{
extern int h;
h = 33;//error: 'h' was not declared in this scope
cout << h << endl;
return ;
}
int h = 0;
在程序中,局部变量和全局变量的名称可以相同,但是在函数内,局部变量的值会覆盖全局变量的值。
//定义一个全局变量j
int j = 9;
void variable_scope()
{
cout << j << endl;
if (a == 10)
{
++j;
cout << j << endl;
}
j = 123;
cout << j << endl;
}
也可以在局部变量中定义和全局变量相同的变量,两者互不影响。在函数体内也可以存在重复定义的变量,但前提也是他们的作用域不同。所以养成良好的习惯,尽量避免变量命名的重复。如果你想在函数体或其他代码块中使用全局变量,你可以在变量名前通过域名在函数中引用到全局变量,不加域名解析则使用的是局部变量。
//定义一个全局变量j
int j = 9;
void variable()
{
j = 123;
}
void variables()
{
//定义if条件体中的局部变量j
int j = 33;
cout << j << endl;
if(j == 33)
{
//使用域名解析调用全局变量
cout << ::j << endl;
//定义if条件体中的局部变量j
int j = 45;
cout << j << endl;
}
return ;
}
初始化局部变量和全局变量:
当局部变量被定义时,系统不会对其初始化,您必须自行对其初始化。定义全局变量时,系统会自动初始化为下列值:
数据类型 | 初始化默认值 |
---|---|
int | 0 |
char | '\0' |
float | 0 |
double | 0 |
pointer | NULL |
正确地初始化变量是一个良好的编程习惯,否则有时候程序可能会产生意想不到的结果。