计算机程序设计c++ 6-3:变量的作用域及存储类型
2021/10/26 1:10:15
本文主要是介绍计算机程序设计c++ 6-3:变量的作用域及存储类型,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
变量的作用域
变量的作用域是指变量的使用范围。
根据变量的使用范围不同,C++中的变量被分为局部变量和全局变量。
局部变量
在一个函数内或复合语句内定义的变量称为局部变量(函数的形参也属于局部变量)
局部变量只允许在其定义的函数或复合语句中使用,离开所在的函数或复合语句后该局部变量将不能使用
- 例1
主函数中定义的变量也不能在其它函数中使用
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变量,它属于主函数的局部变量
- 例2
复合语句中定义的变量,也只能在该复合语句中使用
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 }
注意:
复合语句中定义的变量,也只能在该复合语句中使用
- 例3
for 语句中控制变量的作用域
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; }
注意
在函数中,当局部变量与全局变量同名时,遵循“局
部变量优先”的原则。这时,如果想使用全局变量,应在变
量名前加上作用域运算::
即可。
使用用全局变量的几点说明:
- 全局变量的作用范围是从定义点到整个源程序的结束。在定义点之前,如果其它函数要引用全局变量,可以在该函数中用 extern 对全局变量进行声明。
- 使用全局变量,可以增加函数间的直接联系,减少函数定义时的参数
- 由于全局变量在整个程序运行中始终占用内存,这样,使用全局变量将降低程序的通用性、可靠性和移植性,这是全局变量的负面作用
变量的存储类型
不同的变量所分配的存储区域也不同,这就是变量的存储类型。
- C++程序运行时使用的内存区域
- 变量的存储类型
变量的存储类型是变量在内存中存储的方式,根据变量的存储类型,可以知道变量的作用域和生存期。这里,介绍4个存储类型,分别是 - auto(自动类)
- register(寄存器类)
- static(静态类)
- extern(外部类)
在c++中定义一个变量的完整形式是:
<存储类型> <数据类型> <变量名>
自动变量-用auto修饰(默认的定义方式)
例如:
定义一个局部变量i。
auto int i;
与 int i;
是相同的
说明:
自动变量在其定义块(函数或复合语句)开始执行时分配空
间,在块执行结束时释放空间。所以自动变量的生命期开始于块的执行,终止于块的结束
寄存器变量-用register修饰
将尽可能存放在CPU的寄存器中,以提高程序的运行效率
注意
仅局部变量和形参可作为寄存器变量
静态变量-用static修饰
- 静态变量分配在全局数据区中,定义时系统将提供默认的初始值
- 静态变量在编译时分配存储空间,在整个程序执行结束后释放存储空间。所以,静态变量具有全局生命期
- 根据声明的位置不同,静态变量又分为静态局部变量和静态全局变量
- 静态局部变量是在“块”中定义的静态变量。它具有局部作用域,却有全局生命期。在“块”执行结束后,该静态局部变量并不释放(其值依旧存在),以便下次调用时可继续使用。
外部变量-用extern修饰
如果在一个源文件中定义的全局变量要在其它源文件中使用,则在使用前应该用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; }
这篇关于计算机程序设计c++ 6-3:变量的作用域及存储类型的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15PingCAP 黄东旭参与 CCF 秀湖会议,共探开源教育未来
- 2024-05-13PingCAP 戴涛:构建面向未来的金融核心系统
- 2024-05-09flutter3.x_macos桌面os实战
- 2024-05-09Rust中的并发性:Sync 和 Send Traits
- 2024-05-08使用Ollama和OpenWebUI在CPU上玩转Meta Llama3-8B
- 2024-05-08完工标准(DoD)与验收条件(AC)究竟有什么不同?
- 2024-05-084万 star 的 NocoDB 在 sealos 上一键起,轻松把数据库编程智能表格
- 2024-05-08Mac 版Stable Diffusion WebUI的安装
- 2024-05-08解锁CodeGeeX智能问答中3项独有的隐藏技能
- 2024-05-08RAG算法优化+新增代码仓库支持,CodeGeeX的@repo功能效果提升