C++ 变量作用域
通常来说,一段程序代码中所用到的名字并不总是有效/可用的, 而限定这个名字的可用性的代码范围就是这个名字的作用域。
作用域的使用提高了程序逻辑的局部性,增强程序的可靠性,减少名字冲突
一般来说有三个地方可以定义变量:
-
在函数或一个代码块内部声明的变量,称为
局部变量
-
在函数参数的定义中声明的变量,称为
形式参数
-
在所有函数外部声明的变量,称为
全局变量
我们将在后续的章节中学习什么是函数和参数。
在本章我们先来学习局部变量声明和全局变量的声明
局部变量
在函数或一个代码块内部声明的变量,称为局部变量。
局部变量只能被函数内部或者代码块内部的语句使用。
我们来看一个使用了局部变量的范例
/** * file: main.cpp * author: 简单教程(www.twle.cn) * * Copyright © 2015-2065 www.twle.cn. All rights reserved. */ #include <iostream> using namespace std; int main () { // 局部变量声明 int a, b; int c; // 实际初始化 a = 17; b = 29; c = a + b; cout << c << endl;; return 0; }
编译运行以上程序,输出结果如下
$ g++ main.cpp && ./a.out 46
全局变量
在所有函数外部定义的变量(通常是在程序的头部),称为全局变量。
全局变量的值在程序的整个生命周期内都是有效的。
全局变量可以被任何函数访问。也就是说,全局变量一旦声明,在整个程序中都是可用的。
我们来看一个使用了全局变量和局部变量的范例
/** * file: main.cpp * author: 简单教程(www.twle.cn) * * Copyright © 2015-2065 www.twle.cn. All rights reserved. */ #include <iostream> using namespace std; // 全局变量声明 int g; int main () { // 局部变量声明 int a, b; // 实际初始化 a = 17; b = 33; g = a + b; cout << g << endl; return 0; }
编译运行以上范例,输出结果如下
$ g++ main.cpp && ./a.out 50
在程序中,局部变量和全局变量的名称可以相同
但是在函数内,局部变量的值会覆盖全局变量的值。
看一个局部变量屏蔽全局变量的范例
/** * file: main.cpp * author: 简单教程(www.twle.cn) * * Copyright © 2015-2065 www.twle.cn. All rights reserved. */ #include <iostream> using namespace std; // 全局变量声明 int g = 33; int main () { // 局部变量声明 int g = 17; cout << g << endl; return 0; }
编译运行以上范例,输出结果如下
$ g++ main.cpp && ./a.out 17
局部变量和全局变量初始化
当局部变量被定义时,系统不会对其初始化,我们必须自行对其初始化。
但定义全局变量时,系统会自动初始化为下列值:
数据类型 | 初始化默认值 |
---|---|
int | 0 |
char | '\0' |
float | 0 |
double | 0 |
pointer | NULL |
最佳实战
正确地初始化变量是一个良好的编程习惯,否则有时候程序可能会产生意想不到的结果