C++ 变量声明 定义 作用域 链接性总结
变量定义
变量的定义用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义。
变量声明
用于向程序表明变量的类型和名字。程序中变量可以声明多次,但只能定义一次。
变量的类型
(1)自动存储变量: 在函数定义中声明的变量(包括函数参数)。当函数或代码块执行时创建变量,当函数或代码块执行完时,这些变量的内存被释放。这类变量在 栈 中分配内存。
(2)静态持续变量: 在函数定义外定义的变量和使用关键字 static 定义的变量,简称 静态变量。这类变量在程序整个运行过程中都存在
(3)动态存储变量: 由 new 运算符分配内存的变量,直到使用delete运算符将其释放或程序结束。这类变量在 堆(自由存储区) 中分配内存。
(4)线程存储变量: 此变量生命周期和线程一样长。这里不做过多解释。
5种变量储存方式
| 存储描述 | 持续性 | 作用域 | 链接性 | 如何声明 |
|---|---|---|---|---|
| 自动 | 自动 | 代码块 | 无 | 在代码块中 |
| 寄存器 | 自动 | 代码块 | 无 | 在代码块中,使用关键字 register |
| 静态,无链接性 | 静态 | 代码块 | 无 | 在代码块中,使用关键字 static |
| 静态,外部链接性 | 静态 | 文件 | 外部 | 不在任何函数内 |
| 静态,内部链接性 | 静态 | 文件 | 内部 | 不在任何函数内,使用关键字 static |
述了名称在文件的多大范围内可见。
(1)全局作用域:从变量定义到文件结尾都可用,所以也叫 文件作用域。
(2)局部作用域:如自动变量的作用域在函数内部。
链接性
(1)外部链接性:可在其它文件中访问。
(2)内部链接性:只能在当前文件中访问。
(3)无链接性:只能在当前函数或代码块中访问。
静态持续变量初始化
(1)如果没有显示的初始化静态变量,编译器将把它设置为0
(2)在默认情况下,静态数组和结构将每个元素或成员的所有位都设置为0
例:
int global = 1000;
static int one_file = 50;
int main()
{
...
}
void fun(int n)
{
static int count = 0;
int llama = 0;
...
}
分析:global和one_file的作用域都为整个文件,global的链接性为外部,所以可以在程序的其他文件使用它,而 one_file的链接性为内部,只可以在本文件中使用它。(程序是多文件)
count和llama作用域是局部的,没有链接性,也就是说只能在fun()中用它们。因为count变量是静态变量,所以count变量一直存在,即使fun()函数没有执行。而llama变量是当fun()函数执行时被创建,当fun()函数执行完后被释放内存。
多文件使用外部链接性变量
只需在一个文件中包含该变量的定义(单定义规则),但在使用该变量的其他所有文件中,都必须使用关键字 extern 声明它。
例:
//file1.cpp
int cat = 20; //在file1.cpp中定义cat变量
//file2.cpp
extern cat; //在file2.cpp中使用cat变量要先用extern声明
cout << cat << endl;
结束
现在读者应该对变量有了更深刻的认识了
C++ 变量声明 定义 作用域 链接性总结的更多相关文章
- javascript变量声明及作用域总结
javascript变量声明及作用域总结 一.总结 一句话总结:还是得好好看书,光看视频是不得行的,浅学无用,要相互印证,要真正理解才有用,比如<Javascript权威指南> 书 1.j ...
- javascript变量声明 及作用域
javascript变量声明提升(hoisting) http://openwares.net/js/javascript_declaration_hoisting.html 可能要FQ一下 java ...
- C++11 变量和函数的链接性
在全局变量前添加const或者static,则该变量链接性为内部,即文件内有效.可以使用extern声明为外部. 如果要让函数的链接性为内部,则函数声明和定义都应使用static关键字. 例子: te ...
- 【转】javascript变量声明 及作用域
javascript变量声明提升(hoisting) javascript的变量声明具有hoisting机制,JavaScript引擎在执行的时候,会把所有变量的声明都提升到当前作用域的最前面. 先看 ...
- 浅谈javascript函数,变量声明及作用域
javascript函数跟变量的声明.作用域这些概念网上都已经讲烂了. 这里写个博客,也相当于做个笔记. 变量声明 首先看个例子: var globalVar = "gv"; fu ...
- javascript 变量声明 和 作用域
变量的声明 1.变量声明具有提升机制,Javascript在执行时,会把所有的声明都提升到当前作用域前面. 先看一下下面的例子: (function(){ alert(b)//b is not def ...
- Typescript学习笔记(三)变量声明及作用域
ts的变量声明有var,let和const,这尼玛完全跟es6一样嘛.就稍微介绍一下. 大多数js开发者对于var很熟悉了,原生js里没有块级作用域,只有函数作用域和全局作用域,还存在var的变量提升 ...
- 关于js中变量声明和作用域的理解
1. var是声明一个变量:虽然声明了这个变量,但在存入值之前,它的初始值是 undefined:2.全局变量:拥有全局作用域,在js代码中的任何地方都是有定义的:3.局部变量:在函数内声明的变量只在 ...
- C++ 多文件编译简述:头文件、链接性、声明与定义
目录 Commen Sense 头文件 链接性 static 与链接性控制 extern 与外部链接性 Reference Commen Sense C++ 在编译时对每个翻译单元(Translati ...
随机推荐
- 停止:service jenkins stop,提示:Failed to stop jenkins.service: Unit jenkins.service not loaded.
uni@uni-virtual-machine:~$ service jenkins stop Failed to stop jenkins.service: Unit jenkins.service ...
- P4491-[HAOI2018]染色【多项式,二项式反演】
正题 题目链接:https://www.luogu.com.cn/problem/P4491 题目大意 给\(n\)个物品染上\(m\)种颜色,若恰好有\(k\)个颜色的物品个数为\(S\)那么就会产 ...
- YbtOJ#912-神秘语言【结论,欧拉定理】
正题 题目链接:http://www.ybtoj.com.cn/problem/912 题目大意 给出\(L,R\),求有多少长度在\([L,R]\)之间的字符串满足依次取出所有偶数位置的放在最前面后 ...
- 实验3:OpenFlow协议分析实践
作业链接:实验3:OpenFlow协议分析实践 一.实验目的 能够运用 wireshark 对 OpenFlow 协议数据交互过程进行抓包: 能够借助包解析工具,分析与解释 OpenFlow协议的数据 ...
- Java实现爬取京东手机数据
Java实现爬取京东手机数据 最近看了某马的Java爬虫视频,看完后自己上手操作了下,基本达到了爬数据的要求,HTML页面源码也刚好复习了下,之前发布两篇关于简单爬虫的文章,也刚好用得上.项目没什么太 ...
- Unity——FSM有限状态机
FSM有限状态机 一.设计思路 1.共同的状态父类,提供可重写的进入,保持,退出该状态的生命周期方法: 2.状态机,管理所有状态(增删查改),状态机运行方法(Run): 3.在角色控制器中,实例化状态 ...
- 题解 [HAOI2017]方案数
题目传送门 Solution 我们没有障碍的时候很好做,直接设 \(f_{i,j,k}\) 表示到 \((x,y,z)\) \(x\) 有 \(i\) 位为 \(1\),\(y\) 有 \(j\) 位 ...
- 某个buuctf的题(easy_tornado)
题目:http://88099f53-12b6-470a-9993-b73e4155940e.node3.buuoj.cn/ 1首先看三个文件的内容 2简单分析 如果出题人没整一些花里胡哨的,那么fl ...
- pta天梯训练赛补题
7-1谁先倒 划拳是古老中国酒文化的一个有趣的组成部分.酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字.如果谁比划出的数字正好等于两人喊出的数字之和,谁就输了,输家罚一杯酒.两人 ...
- Mysql双主双从高可用集群的搭建且与MyCat进行整合
1.概述 老话说的好:瞻前顾后.患得患失只会让我们失败,下定决心,干就完了. 言归正传,之前我们聊了Mysql的一主一从读写分离集群的搭建,虽然一主一从或一主多从集群解决了并发读的问题,但由于主节点只 ...