变量的作用域是指变量的使用范围。
根据变量的使用范围不同,C++中的变量被分为局部变量和全局变量。
在一个函数内或复合语句内定义的变量称为局部变量(函数的形参也属于局部变量)
局部变量只允许在其定义的函数或复合语句中使用,离开所在的函数或复合语句后该局部变量将不能使用
int main() { int sum = 0; sum = f(10); cout << sum << endl; return 0; } int f(int n) { for(int i=1; i<= n; i++) { sum += i; } return sum; }
注意:
在函数f中,不能使用主函数中的sum变量,它属于主函数的局部变量
int main() { int i=1, j=3; cout << i << " "; i++; { int i = 0; i+= j*2; cout << i << j << endl; } cout << i << ', ' <<j << endl; // 1, 6, 3, 2, 3 }
注意:
复合语句中定义的变量,也只能在该复合语句中使用
int main() { int a[] = {34, 56, 23, 41, 33} int x; cin >> x; for(int i=0; i<5; i++) { if(x==a[i]) break; } if(i<5) // i use error cout << "已经找到,下标为:" << i << endl; else cout << "未找到!" << endl; return 0; }
注意:
编译系统通常将循环语句中定义的变量作为局部变量处理,
因此该变量在循环外是不能使用的
说明:局部变量是在执行该函数或复合语句时自动建立,
当该函数或复合语句执行完毕后将自动释放。所以在不同
的函数或复合语句中定义同名的局部变量,也不会相互干
扰。
例子
int a = 3, b = 5; int max(int a, int b) { return a>b ? a:b; } int main() { int a = 8; cout << max(a, b) << endl; // 8 cout << max(::a, b) << endl; // 5 return 0; }
注意
在函数中,当局部变量与全局变量同名时,遵循“局
部变量优先”的原则。这时,如果想使用全局变量,应在变
量名前加上作用域运算::
即可。
使用用全局变量的几点说明:
不同的变量所分配的存储区域也不同,这就是变量的存储类型。
在c++中定义一个变量的完整形式是:
<存储类型> <数据类型> <变量名>
例如:
定义一个局部变量i。
auto int i;
与 int i;
是相同的
说明:
自动变量在其定义块(函数或复合语句)开始执行时分配空
间,在块执行结束时释放空间。所以自动变量的生命期开始于块的执行,终止于块的结束
将尽可能存放在CPU的寄存器中,以提高程序的运行效率
注意
仅局部变量和形参可作为寄存器变量
如果在一个源文件中定义的全局变量要在其它源文件中使用,则在使用前应该用extern进行声明,表示该全局变量不是在本文件中定义的。
例:
在1.cpp文件中定义全局变量
int Dimension=100;
如果在2.cpp文件中使用,这时,应在2.cpp文件中声明如下:
extern int Dimension;
静态全局变量:
全局变量可以在其它源文件中使用。如果在全局变量前加上static修饰符,则成为静态全局变量。静态全局变量只能在本文件中使用
例如:
函数调用计数器,使用静态局部变量统计某个函数被调用的次数
void fun() { static int n =0; // 局部静态变量, 第一次调用时候赋值为0,之后都是按照之前的数值计算 // int n = 0; // 每次输出都是1 n++; cout << "本函数被调用了" << n << "次" << endl; } int main() { int i; for(i=1; i< 3; i++) { fun(); } fun(); return 0; }