C++变量作用域(详解版)
C++ 允许在程序中几乎任何地方创建变量。常见的做法是在函数顶部定义函数的所有变量,也就是在标记主体开始的开放大括号之后。当然,在一些更长的程序中,变量有时在程序使用它的位置附近定义,只要在使用之前定义它们就没问题。
我们知道,使用大括号包围一个或多个编程语句即定义了一个代码块。函数 main 的主体必须被大括号包围,它就是一个代码块。与 if 或 if-else 语句中的 else 相关联的一组语句也同样是代码块。
无论如何,变量都需要定义在代码块的内部,也可以在任何代码块内定义一个变量。变量的作用域就是它的定义语句和块的闭括号之间的那一部分。因此,在函数顶部定义的变量,其作用域实际上就是整个函数,而内部块中定义的变量,其作用域就是该块。
下面的程序在后面定义了它的变量:
years 变量在第 18 行中定义,包围它的大括号标记的代码块是由 if 语句有条件地执行的代码块,所以它的作用域只包括第 18〜22 行。也就是从它被定义的点到关闭if代码块的大括号之间的行。这些在一组大括号内定义的变量被称为具有局部作用域或块作用域。在局部作用域之外,这些变量是不可见的,也不能被使用。
注意,当一个程序正在运行并且它进入构成一个变量作用域的代码段时,就称该变量进入作用域。这只是意味着变量现在可见,程序可以引用它。同样,当一个变量离开作用域时,它就不再能敢使用。
警告,尽管在嵌套块中定义变量是完全可以接受的,但是在命名时应该避免与外部块中的变量相同,毕竟这样太容易将一个变量与另一个变量混淆了。
我们知道,使用大括号包围一个或多个编程语句即定义了一个代码块。函数 main 的主体必须被大括号包围,它就是一个代码块。与 if 或 if-else 语句中的 else 相关联的一组语句也同样是代码块。
无论如何,变量都需要定义在代码块的内部,也可以在任何代码块内定义一个变量。变量的作用域就是它的定义语句和块的闭括号之间的那一部分。因此,在函数顶部定义的变量,其作用域实际上就是整个函数,而内部块中定义的变量,其作用域就是该块。
下面的程序在后面定义了它的变量:
#include <iostream> using namespace std; int main() { //Constants for minimum income and years const double MIN_INCOME = 35000.0; const int MIN_YEARS = 5; // Get the annual income cout << "What is your annual income? "; double income; // Variable definition cin >> income; if (income >= MIN_INCOME) { //Income is high enough, so get years at current job cout << "How many years have you worked at your current job? "; int years; // Variable defined inside the if block cin >> years; if (years > MIN_YEARS) cout << "\nYou qualify.\n"; else cout << "\nYou must have been employed for more than "<< MIN_YEARS << " years to qualify.\n"; } else // Income is too low { cout << "\nYou must earn at least $" << MIN_INCOME << " to qualify.\n"; } return 0; }程序的第 11 行中定义了 income 变量,它在标记 main 函数代码块的大括号内,所以它的作用域包括第 11〜28 行,也就是从它被定义的行到 main 函数封闭大括号的位置,在这个作用域内它都可以被程序使用。
years 变量在第 18 行中定义,包围它的大括号标记的代码块是由 if 语句有条件地执行的代码块,所以它的作用域只包括第 18〜22 行。也就是从它被定义的点到关闭if代码块的大括号之间的行。这些在一组大括号内定义的变量被称为具有局部作用域或块作用域。在局部作用域之外,这些变量是不可见的,也不能被使用。
注意,当一个程序正在运行并且它进入构成一个变量作用域的代码段时,就称该变量进入作用域。这只是意味着变量现在可见,程序可以引用它。同样,当一个变量离开作用域时,它就不再能敢使用。
同名变量
当块嵌套在另一个块中时,内部块中定义的变量可能与外部块中定义的变量具有相同的名称。虽然一般认为这样做不妥,因为它很可能会导致混乱,但其实这样做是被允许的。当内部块中的变量进入作用域时,外部块中的变量变为“隐藏”,不能使用。下面的程序说明了这一点:// This program uses two variables with the same name. #include <iostream> using namespace std; int main() { int number; // Define a variable named number cout << "Enter a number greater than 0: "; cin >> number; if (number > 0) { int number; // Define another variable named number cout << "Now enter another number: "; cin >> number; cout << "The second number you entered was "; cout << number << endl; } cout << "Your first number was " << number << endl; return 0; }程序输出结果:
Enter a number greater than 0: 2
Now enter another number: 7
The second number you entered was 7
Your first number was 2
警告,尽管在嵌套块中定义变量是完全可以接受的,但是在命名时应该避免与外部块中的变量相同,毕竟这样太容易将一个变量与另一个变量混淆了。
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算