zoukankan      html  css  js  c++  java
  • lr如何屏蔽全局变量的影响

    首先要熟悉C语言的全局变量和局部变量的含义:

    C语言中的变量详解
     
    先说说变量的作用域,比如,在函数中,形参变量只是在被调用期间才分配内存单元,调用结束立即释放。这就说明形参变量只有在函授内才是有效的,离开该函数就不能再使用了。
     
    这种变量有效性的范围称为变量的作用域。当然不仅仅是形参变量,在C中所有的量都有自己的作用域。
    C中的变量,按作用域可分为两种,局部变量和全局变量。
    局部变量:
    也称内部变量。局部变量是在函数内做定义说明的,其作用域仅限于函数内部,离开函数后再使用这种变量是非法的。
    如:  void delay(unsigned int  x)
          { unsigned char  i,j;  //i  j  的作用域只是在delay函数内
     
           }
    关于局部变量的作用域的几点说明:
    1、主函数中定义的变量也只能在主函数中使用,不能在其他函数中使用。同时,主函数中也不能使用其他函数中定义的变量。因为主函数也是一个函数,它与其他函数是平行关系。
    2、形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。
    3、允许在不同函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。
    4、在复合语句中也可以定义变量,其作用域只是在复合语句范围内。
       比如:   main( void)
            {
             Int s,a;
             ……
                {
                   Int b;
                    s=a+b;
                    ……     //b的作用域
                 }
              ……           //s,a的作用域
             }
    全局变量
    也称外部变量,在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。在函数中使用全局变量,一般要作全局变量说明。只有在函数内经过说明的全局变量才能使用。全局变量的说明符extern。但在一个函数之前定义的全局变量,在该函数内使用可不再加以说明。
     
     
     
     
    如:    int a,b; // 外部变量  a,b
            Void   f1( )
            {
              ……
             }
           Float  x,y;//外部变量  x,y
            Int  f2( )
            {
              ……
             }
            Main(  )
            {
             ……
             }
    在上例中,a b x y都是在函数外部定义的外部变量,都是全局变量,但是x y定义在F1函数之后,在F1中又无对x y的说明,所以x y在F1函数中是无效的,a b 定义在源程序的最前面,因此在F1 F2及main函数中即使不加以说明仍然可以使用。这也是在单片机编程中把全局变量写在程序函数之前的原因。
    如果同一个源文件中,外部变量与局部变量同名,则局部变量的作用范围内,外部变量被“屏蔽”即不起作用。
    用extern声明外部变量
    外部变量是在函数的外部定义的变量,其作用域是从变量定义处开始,到本程序文件的末尾。如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件的结尾。如果在定义点之前的函数想引用该外部变量,则应在引用之前用关键字extern对该变量作“外部变量声明”。表示该变量是一个已经定义的外部变量。
    #include<reg52.h>
    unsigned int  a,b;
    void sumab()
    {
     unsigned int s1,s2 ;
     extern unsigned int x,y;
     s1=a+b;
     s2=x+y;
    }
    void main()
    {
     sumab();
     while(1);
    }
     
    unsigned int x=3,y=4;
     
    程序的最后1行定义了外部变量x,y,但由于外部变量定义的位置在函数main之后,本来是在main中不能引用外部变量x,y。当在main函数中用extern对x,y进行了“外部变量声明”,就可以从“声明”处起,合理的使用该外部变量x和y。
    变量的存储类别
    动态存储方式和静态存储方式
    变量从作用域(空间)上分为全局变量和局部变量。
    从存在的时间(生存期)的角度可分为静态存储方式和动态存储方式。
    静态存储方式:在程序运行期间分配固定的存储空间的方式。
    动态存储方式:在程序运行期间根据需要进行动态的分配存储空间的方式。
    用户存储空间可以分为三个部分:
    1、程序区
    2、静态存储区
    3、动态存储区
    全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序执行完毕就释放,在程序执行的过程中它们占据固定的存储单元,而不动态的进行分配和释放。
    动态存储区存放如下的数据:
    1、函数形式参数
    2、自动变量(未加static声明的局部变量)
    3、函数调用的现场保护和返回地址;
    对于上面的数据,在函数开始调用时分配动态存储空间,函数结束时释放这些空间。
    在C中,每个变量和函数有两个属性:数据类型和数据的存储类别。
    Auto变量
    局部变量,如不专门声明是static存储类别,都是动态地分配存储空间的,数据存储在动态存储区中。自动变量用关键字auto作为存储类别的声明。也可以隐含不写,系统默认是auto.
    static声明局部变量
    加入希望函数中的局部变量的值在函数调用后不消失而是保留原值,这时可以将局部变量用static进行声明,变为“静态局部变量”。
    对静态局部变量的说明:
    1、静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序运行期间都不释放。
    2、静态局部变量在编译时赋初值,即只赋初值一次;而对自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。
    3、如果在定义局部变量时不赋初值的话,对静态局部变量来说,编译时自动赋初值0或空字符。而对自动变量来说,如果不赋初值则它的值是一个不确定的值。
    Register变量
    为了提高效率,C允许将局部变量的值放在CPU中的寄存器中,这种变量就叫寄存器变量,用关键字register声明。
    说明:
    1、只有局部变量和形式参数可以作为寄存器变量
    2、一个计算机系统中的寄存器数目是有限的,不能定义任意多个寄存器变量。
    3、局部静态变量不能被定义成寄存器变量。

    lr其实也是一样:

    在lr中,当局部变量和全局变量同名时,在局部变量的作用范围内,全局变量不起作用,

    例如在lr中,在Action()函数外部,定义了全局变量a=10,然后在Action()内部定义了局部变量a=8,则在Action()中打印a的值应该为8,而不是10

  • 相关阅读:
    视频直播技术-视频-编码-传输-秒开等<转>
    弹出框JBox实例
    Dijkstra in python
    oracle 修改索引现有表空间
    WIN7 如何关闭Aero
    不再打酱油
    Android 开机默认横竖屏
    cocos2d-x 3.0 开发(一) Hello_New_World
    PHOTOSHOP 中画笔工具和铅笔工具的一个小小差别
    一种从JSON数据创建Java类的高效办法
  • 原文地址:https://www.cnblogs.com/qmfsun/p/4499431.html
Copyright © 2011-2022 走看看