我们知道,使用大括号包围一个或多个编程语句即定义了一个代码块。函数 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
此程序中有两个单独的变量名 number。一个在外部块中的第 7 行上定义,另一个在内部块中的第 12 行上定义。内部块中的 cin 和 cout 语句(属于 if 语句)只能与该块中定义的 number 变量一起使用。一旦程序离开该块,内部 number 离开作用域,将再次显示外部 number 变量。
警告,尽管在嵌套块中定义变量是完全可以接受的,但是在命名时应该避免与外部块中的变量相同,毕竟这样太容易将一个变量与另一个变量混淆了。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/22049.html