总结一下C++中变量的存储类别以及变量的作用域

(1)标示符的存储类别决定了标示符在内存中存在的时间(我们可以理解标示符就是确定一个变量的符号,也就是我们所说的变量名)





二:存储类别

(1)静态存储类别:静态存数类别变量(我们简称静态变量),从程序的开始处就存在,其生命期伴随整个程序。

(2)自动存储类别:当变量时自动存储类别时,变量在进入到定义它们的程序快时定义它,在离开它们所在的程序块(作用域)时销毁它,因此成为自动变量。其中关键字auto和register用来声明自动类型的变量,





三:自动存储类型

(1) 只有在函数中的局部变量才是自动存储类型的,我们在MAIN函数中定义的变量一般都是自动变量,关键字auto可以不写,默认情况局部变量就是自动变量(我们把自动存储类别的变量叫自动变量)如下图:

int a;

int b;

都是自动变量

(2)自动变量还有一种寄存器变量,既使用关键字register,我们把经常被调用的变量声明为寄存器变量,顾名思义,让变量存在于寄存器中,达到更加快速的存储,这个我们了解即可,现在很多编译器带有可以识别频繁使用变量的功能,不需要程序员手动设置。

根据最小特权原则,我们应该定义自动变量。代码应该只被赋予它仅能完成设计任务的权限,无需更多权限。

  



 四:静态存储类别

(1)关键字extern和static用于静态存储类别的变量,静态存数类别变量(我们简称静态变量),从程序的开始处就存在,其生命期伴随整个程序,一直存在程序的执行过程,但是:即便是静态变量,也并不意味着这些变量(专业来说叫:标识符),在整个程序都是能用的(或者说是可以访问的),这一点在下面有专门的实例。

      (2)对于静态变量,许多被误认为和全局变量一致,这一点是错误的,static变量仅仅在变量的作用范围内可见,而全局变量是在所有地方都可见的,这就是static变量与全局变量的区别,我们要纠正一点:存储类别(存数类型)和变量的作用域是两个独立的问题。

我们应该遵循最小特权原则,不去使用全局变量。

(3)我们解释一下,全局变量和静态变量的区别:全局变量是不显示用static修饰的全局变量,但全局变量默认是静态的,作用域是整个工程,在一个文件内定义的全局变量,在另一个文件中,通过extern 全局变量名的声明,就可以使用全局变量。

全局静态变量是显示用static修饰的全局变量,作用域是所在的文件,其他的文件即使用extern声明也不能使用。

五:标识符(变量)的作用域

(1)   程序中可以使用标识符的范围成为标识符 的作用域,其中我们称标识符为变量,更加专业。例如:我们在一个语句块中声明了一个局部的变量,那么只能在该语句块中使用该变量。

(2)其中作用域大致分为四个:

l  全局作用域:此变量对于从其声明处到文件结束,都是已知的。

l  局部作用域:一个语句块中声明的变量,其作用域在于该语句块中。

l  函数原型作用域:就是函数的形参列表中。

这里着重标记一下局部作用域:当语句块是嵌套的,并且外层语句块中的一个标识符和内层语句块中的标识符名字一致时,外层语句块中的标识符被隐藏,直到内层语句块结束。





六 注意:

(1)我们应该避免使用全局变量,使用全局变量可能在不需要访问变量时却错误的访问变量,违反最小特权原则。仅用于特定函数中的变量应该声明为那个函数的局部变量,而不是全局变量。

(2)应该避免使用会隐藏在外部作用域中名称的变量名,这可以通过在程序中避免使用相同的标识符。

上述总结说明了变量的类型以及作用域,此时我们举个程序,列举上述出现的情况。如下:

#include<iostream>
using namespace std; void use_Global(); //声明函数
void use_Local();
void use_Static_Local(); int a=1; //在函数外定义一个全局的变量 int main()
{
cout<<"the value of global a in the main function is "<<a<<endl;
//<span style="color:#ff0000;">输出全局变量的值,值为 1</span> int a=10; //在MAIN函数中定义一个同名字的局部变量
cout<<"now ,in the main function , local a is "<<a<<endl;
//<span style="color:#ff0000;">输出局部变量,此时全局变量被隐藏,此时的输出的值为 10</span> { //在语句块中定义局部变量
int a=7;
cout<<"int the scope ,local a is "<<a<<endl; //<span style="color:#ff0000;">输出值为:7</span>
}
cout<<"local a in the main's outer scope is"<<a<<endl;
//<span style="color:#ff0000;">脱离语句块,输出变量,输出值为:10</span> use_Local(); //使用函数,函数中定义一个局部变量
use_Static_Local(); //使用函数,函数中定义一个静态局部变量
use_Global(); //使用函数,函数中使用全局变量 use_Local();
use_Static_Local();
use_Global(); return 0;
} void use_Global()
{
cout<<"\n global a is "<<a<<endl;//<span style="color:#ff0000;">此作用域中,没有定义同名的标识符,所以输出的全局变量,值为10</span>
cout<<"enter the use_Global function "<<endl;
a++;
cout<<"\n global a is "<<a<<" on the exit "<<endl;
}
void use_Local()
{
int a=20;
cout<<"enter the function use_Local, the a is "<<a<<endl;
a++;;
cout<<"exit the function use_Local, the a is "<<a<<endl;
}
void use_Static_Local()
{
static int a=5; //定义静态变量,函数调用结束后,仍存在,但是仅在此函数中可以调用,脱离此作用域,就不行。
cout<<"enter the function use_Static_Local, the a is "<<a<<endl;
a++;;
cout<<"exit the function use_Static_Local, the a is "<<a<<endl;
}

C++变量的存储类别与作用域的更多相关文章

  1. c语言 变量的存储类别以及对应的内存分配?

    <h4><strong>1.变量的存储类别</strong></h4>从变量值存在的角度来分,可以分为静态存储方式和动态存储方式.所谓静态存储方式指在程 ...

  2. C语言变量的存储类别

    我们知道,从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变量. 从另一个角度,从变量值存在的作时间(即生存期)角度来分,可以分为静态存储方式和动态存储方式. 静态存储方式:是指在程序运行期 ...

  3. [C++程序设计]变量的存储类别

    全局变量全部存放在静态存储区中,在程序开始执行时给全局变量分配存储单元,程序执行完毕就释放这些空间.在程序执行过程中它们占据固定的存储单元,而不是动态地进行分配和释放. 在动态存储区中存放以下数据: ...

  4. c++ 变量的存储类别

    c++的存储类别 首先我们得知道c++的变量存储方式:静态存储和动态存储两种,全局变量使用的是静态存储,函数的形参和局部变量是使用的动态存储. 当然在有的教程中又分为自动存储,静态存储,动态存储.相信 ...

  5. C++变量作用域、生存期、存储类别

    写C.C++代码的小伙伴一定在头疼变量的作用域.生存期.存储类别问题.什么静态.外部.寄存器.局部.全局搞得一头雾水.今天咱们就来梳理一下他们的变态关系(什么不得了的事情???) 1.变量的作用域 说 ...

  6. C++变量存储类别和内存四区

    变量存储类别 变量声明/定义的一般形式: 存储类别 数据类型 变量名 存储类别指的是数据在内存中存储的方法.存储方法分为静态存储和动态存储两大类.标准C语言为变量.常量和函数定义了4种存储类型:ext ...

  7. C语言变量、函数的作用域及变量的存储方式

    一.变量的作用域和存储方式 在C语言中每个变量都有两种基本属性:数据类型.数据的存储类别. 数据类型很多人都已熟知,例如:字符型(char).整型(int).浮点型(float)等等.存储类别是指数据 ...

  8. [转]深入探讨C语言中局部变量与全局变量的作用域与存储类别

    C语言中局部变量和全局变量变量的作用域与存储类别(auto,static,extern,register) 1.局部变量和全局变量在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元, ...

  9. C语言杂谈(三)存储类别

    本文讨论C语言中的存储类别,包括数据在内存的存储.变量的存储类别.函数的存储类别.生存周期.下图为计算机的存储空间,有寄存器和内存. 一.存储区域 1.寄存器:存放立即参加运算的数据. 2.系统区:存 ...

随机推荐

  1. C# 反射操作方法

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.R ...

  2. 【MVC】ASP.NET MVC 请求生命周期

    当一个asp.net mvc应用程序提出请求,为了响应请求,包含一些请求执行流程步骤! 在asp.net mvc应用程序Http request和Http response 过程中,主要包含8个步骤: ...

  3. Apache虚拟主机配置(多个域名访问多个目录)

    Apache虚拟主机配置(多个域名访问多个目录) 为了方便管理虚拟主机,我决定使用一种方法,那就是修改httpd-vhosts.conf文件. 第一步首先要使扩展文件httpd-vhosts.conf ...

  4. 1. Hello UWP

    1. UWP UWP,Universal Windows Platform,也就是 Windows 10 新推出的通用平台应用,只要一次编码,即可运行在 Windows 10 电脑以及手机上,甚至可以 ...

  5. 必须会的SQL语句(四)删除和更新

    1.删除   1)删除记录   Delete from 表名 where id ='xx'   2)删除所有数据,并回归初始化标识字段.   Truncate table 表名   3)delete与 ...

  6. php7对redis的扩展及redis主从搭建

    这两天在学习一下php7下面的安装及redis相关配置认识.并将笔记记下来.以备后用.主要涉及到redis的扩展php-redis 及redis主从的配置. 一:redis安装     1:下载并安装 ...

  7. HTML5应用之时钟

    利用HTML5的Canvas API可以完成我们以前意想不到的动画效果,以前我们想在网页上放置一个时钟,需要先用flash工具制作一个钟表,并写上复杂的JavaScript代码,然后载入到页面中.而H ...

  8. Yii 增删改查 测试记录

    亲们, 我是yii小白 不要笑话我奥.今天白天写一个管理模块涉及到 yii ar 下的  curd 操作,做 update 操作时纠结了好久,今天晚上花点时间学习, 下面写下我的测试记录 代码如下: ...

  9. PHP入门基础(一)——标记风格、注释、表单获取、字符串类型、变量解析

    PHP标记风格: //XML风格//推荐的标记风格,可以在XML文档中使用 <?php echo '<p>XML Style</p>'; ?> //简短风格——需启 ...

  10. VC++ 在类中添加多线程操作

    CTestThread.h public: CTestThread(void); ~CTestThread(void); public: void setvalue(); static DWORD _ ...