第8章 函数(五)变量的分级保护

简介:        声明:文中观点仅代表个人,其中文字、图片未经本人许可,不得部分或全部转载,违者所造成影响后后果自负!联系本人方式:80368704@qq.

 

 

     声明:文中观点仅代表个人,其中文字、图片未经本人许可,不得部分或全部转载,违者所造成影响后后果自负!联系本人方式:80368704@qq.com QQ:80368704


       上一节我们在全局变量和局部变量难以取舍的矛盾中结束,其实在现实世界中,存在着许多矛盾,他们是如此的对立,但是又同时存在,缺一不可.

       比如:生和死,甜和苦,真和假,男和女,笑和苦,实在是太多了,他们是对立着,同时又统一着,不是吗?人分男和女;人人生娃,都想要男的,没有女娃可以吗?哈哈,矛盾啊矛盾!!!

       我要说的就是局部变量和全局变量各有优点,我们都需要;不一定要否定掉其中的一个,只不过到底用哪一种,需要我们程序员自己选择罢了.也就是变量该如何被共享和保护应该由程序员自己决定,而且必须能由程序员决定;对于一个变量,程序员必须有足够的权利去决定,它让哪些程序或函数使用,同时又不让哪些程序或函数使用.

       于是在C程序设计中,采用了变量分级保护的思想。什么是分级保护的思想呢?举个例子吧:

       对于我个人,有些事情,除了自己,不想让任何人知道的,这样的信息就是我的绝密!而有些事情,除了家人,就不想让外人知道了,这样的信息对我来说就是机密!另外的一些事情,是可以让任何人知道的,这样的信息就是公告了!我们常说:该你知道的,告诉你;不该你知道的,别打听,否则会大祸临头的.个人的信息就这样被我简单的分成了3个保密级别:绝密、机密和公告。这就是我所谓的信息分级保护的思想。更确切的说是分区域分范围的保护,这里的范围有3个:个人、家庭、全社会。我的信息受到了分级思想的保护,从而不会被不该知道的人知道。

       回到C程序设计中来,我们的变量作为程序中的信息,也应能被分级保护;而在第2节中,我们说到程序分4级:工程---文件---函数---复合语句块,因此变量根据定义位置的不同,分4级进行保护,使其不被不该使用它的程序见到它,或者说存取它。

       详细的,在C程序设计中,我们为变量设定的4级保护是:

       块级的变量:相当于最严密的绝密级保护,变量定义在某个块的"{"处,就是块级变量。它只能被定义它的复合语句块中的语句读写;在块内部定义变量时,你可以在变量的定义语句前面加上如下3个词之一:(1)、auto (2)、register (3)、static。 auto说白了就是普通变量,以前我们定义的变量全部是auto变量,写不写auto无所谓。register是寄存器局部变量,初学者不必理解和使用它.而在变量的定义语句加上static后,该变量就定义成了静态的块局部变量.
举例如下:
       #include<stdio.h>
       void main()
       {
        auto int i=1;/*函数局部变量*/
      
        do
        { auto int j=1;/*块局部变量,auto可以省略,即写成int j=0;是一个意思*/
          static k=1;/*块静态局部变量*/
          i++;
          j*=i;
          k*=i;
          printf("j=%d,k=%d/n",j,k);
        }while(i<5);
       printf("k=%d/n",k);/*这句是错误的,因为它试图读取内层块的局部变量k,运行时应该注释掉*/
       getch();
       }
       在后面的章节,我们会专门说明静态变量的作用。

       函数级的变量:同样相当于最严密的绝密级保护,变量定义在某个函数的"{"处,,就是函数级的变量。它只能被定义它的函数中的语句读写;在函数内部定义变量时,你可以在变量的定义语句前面加上如下3个词之一:(1)、auto(2)、register(3)、static局部变量。我们看到函数级和块级的种类是完全相同的.一对{}就像复合语句或函数的外壳一样,保护着它内部定义的变量不被外界存取.

       文件级的变量:相当于机密级,当我们的变量定义在所有函数之外,也就是你定义了一个全局变量,之后,在全局变量定义语句的最前面加上static,就是static(静态)全局变量。这种变量的读写权限比起函数级的变量进一步放松了,即从函数级扩大到文件级。

       工程级的变量:相当于公告级,当我们的变量定义在一个文件的所有函数之外,也就是你定义了一个全局变量,我们知道,函数之外定义的变量是全局变量,当你的全局变量的定义语句前不用static限定时,那么全局变量可以被你的工程中的每一个函数读取和修改。而上面冠以static的全局变量只能被他所在文件的函数读写。这就是static全局变量全局变量的区别所在,本章的例子----程序5中的变量a,b就是全局变量。当然如何在定义全局变量的文件之外使用该全局变量,还是有些麻烦的,详见后面关于可见性的描述。



       还有一些概念,进一步描述一下::
       块级和函数级的变量,在定义它的{}中,可以使用,或者说只有定义它的{}可以看见它,{}之外不可见,不可使用。

       文件级的变量,在定义它的文件中,可以使用,或者说只有定义它的文件中的函数可以看见它,其他文件中的函数见不到它。

       工程级的变量,在定义它的工程中,可以使用,或者说只要是工程函数都有可能可以看见它,即对所有文件中的函数公开.注意有可能这3个字,将会引出extern的讲解(To be continued............)。

       如此我们就有了变量可见性的概念,可以看出,由于定义位置不同,因而变量受到不同级别的保护,于是可见性就不同了.



       变量可以被见到,就可以被使用,或者说变量就可以被存取,我们说变量此时起作用了,

       一般的函数级的变量,在定义它的函数中,起作用,

       一般的文件级的变量,在定义它的文件中,起作用,

       一般的工程级的变量,在定义它的工程中,起作用,

       我们看到各种级别的变量起作用的区域时不同的,这就是所谓作用域的概念. 我们看到作用域有大有小,作用域也有4个,从大到小是:工程区域、文件区域、函数区域、块区域。这4个区域存在包含的关系。我们说块在最内层,而工程区域在最外层。



       变量的可见性和它的作用域大部分情况下是一致的,但是也存在这种情况,即在内层块中定义的变量,隐藏了外层块中同名的变量。一般情况下,没有办法引用被隐藏的变量。
相关文章
|
7月前
|
存储 编译器 C++
C++程序变量存储类别:深入理解与应用
C++程序变量存储类别:深入理解与应用
73 1
|
7月前
|
存储 编译器 C语言
全局变量的存储类别
全局变量的存储类别
63 2
|
7月前
|
存储 C语言
局部变量的存储类别
局部变量的存储类别
55 1
|
7月前
|
编译器 C语言
结构体定量初始化和引用
结构体定量初始化和引用
37 1
|
7月前
|
存储 Java
变量的分类和作用2
变量的分类和作用
44 1
|
7月前
|
Java 编译器
变量的分类和作用1
变量的分类和作用
60 0
|
7月前
|
存储 C# 容器
掌握 C# 变量:在代码中声明、初始化和使用不同类型的综合指南
变量是用于存储数据值的容器。 在 C# 中,有不同类型的变量(用不同的关键字定义),例如: int - 存储整数(没有小数点的整数),如 123 或 -123 double - 存储浮点数,有小数点,如 19.99 或 -19.99 char - 存储单个字符,如 'a' 或 'B'。Char 值用单引号括起来 string - 存储文本,如 "Hello World"。String 值用双引号括起来 bool - 存储具有两个状态的值:true 或 false
103 2
第4章 MATLAB编程基础——4.6 M文件中变量的检测与传递
第4章 MATLAB编程基础——4.6 M文件中变量的检测与传递
|
缓存 运维 监控
【运维知识进阶篇】Ansible变量详解(变量定义+变量优先级+变量注册+层级定义变量+facts缓存变量)
【运维知识进阶篇】Ansible变量详解(变量定义+变量优先级+变量注册+层级定义变量+facts缓存变量)
379 0
|
存储 JSON 数据安全/隐私保护
ansible定义变量和管理事实
ansible定义变量和管理事实
155 0