C语言中变量的作用域

2024-05-19

C语言中变量的作用域(精选三篇)

C语言中变量的作用域 篇1

根据国家教育部对高等院校非计算机专业计算机课程提出的基本要求, 各高校均开设了《大学计算机基础》课程, 数据库是其中非常重要的一个部分。Visual FoxPro (简称VFP) 作为一个面向对象的关系型数据库管理系统, 是开发小规模数据库应用系统和信息管理系统的常用工具, 目前已成为我国高校非计算机专业初次学习数据库管理系统的首选课程[1]。变量在VFP过程调用中有着非常重要的地位, 但不同的变量其作用范围也有所不同。

1 概念

在VFP中, 变量按作用域的不同可以分为三种:公共变量、私有变量、本地变量。变量的作用域指的是变量在什么范围内是有效的或能够被访问的[2]。

1.1 公共变量

公共变量即在任何模块中都可使用的内存变量, 应先建立后使用。建立公共变量的命令格式如下:

PUBLIC<内存变量列表>

命令的功能:将内存变量列表指定的变量设置为公共变量, 并赋逻辑假值.F.为其初值。

说明: (1) VFP默认在命令窗口中定义的变量是公共变量, 但不能在程序方式下使用[3]。 (2) 公共变量作用域很广, 可供上层模块、并列模块、下级模块使用。 (3) 公共变量一旦建立就一直有效, 当程序终止执行时, 公共变量不会自动清除, 只能用清除内存变量的命令来清除。

1.2 本地变量

本地变量是只能在建立它的模块中使用的内存变量, 本地变量也应先建立后使用。建立本地变量的命令格式如下:

LOCAL<内存变量列表>

命令的功能:将内存变量列表指定的变量设置为本地变量, 并赋逻辑假值.F.为其初值。

说明: (1) 为了避免与LOCATE命令混淆, LOCAL不可缩写为前4个字母。 (2) 本地变量不能在其上级模块、下级模块中使用, 其作用域仅为建立它的模块。 (3) 建立本地变量的程序结束时, 本地变量自动释放。

1.3 私有变量

私有变量是可以在定义它的模块及其下层模块中使用的内存变量。

1.3.1 私有变量的定义

私有变量的定义方式有两种, 一种是“隐含定义方式”, 另一种为“显式定义方式”。

1.隐含定义

在程序中没有使用PUBLIC命令和LOCAL命令定义而直接使用的变量, 都称为由系统隐含定义的私有变量。

2.显式定义

通过PRIVATE命令定义的私有变量。其命令格式如下:

PRIVATE<内存变量列表>

命令的功能:声明内存变量列表指定的变量为私有变量, 并屏蔽上级模块的同名变量, 直到声明它的程序、过程或自定义函数执行结束后, 才恢复使用被屏蔽的上级同名变量。

说明: (1) “声明”不同于“建立”。声明仅指定变量的类型不赋值, 建立既指定变量类型, 同时还为变量赋初值。 (2) 私有变量允许与上级模块的变量同名。 (3) 在建立私有变量的模块运行结束后, 私有变量自动清除。

1.3.2 私有变量的作用域

不管是哪种定义方式, 私有变量的作用范围都是定义它的模块及其下级模块。但由于上级模块中可能存在同名变量, 则私有变量的作用域也会发生相应变化。由此, 可以得到以下几种情况。

1.私有变量的作用域包括定义它的模块及其调用的下级模块。即上级模块的私有变量可以在下级模块中使用。

2. 若下级模块中声明的私有变量与上级模块的私有变量同名, 则上级模块中的私有变量的作用域不包括下级模块, 即上级模块的私有变量不能在下级模块中使用。在调用下级模块时将上级模块中同名的私有变量屏蔽, 当下级模块执行完毕返回上级模块时才恢复使用。

2 实例分析

2.1例1

有主程序main1.prg, 一级子程序sub1.prg, 二级子程序sub1-1.prg如下图所示。运行主程序main1.prg, 结果如下图所示为10和5。

从程序运行结果可知, 变量a, b是在子模块sub1.prg中建立的公共变量, 其初值为.F.。在子模块中为变量a进行重新赋值为5, 在下级子模块sub1-1.prg中为变量b重新赋值为10, 因为a, b均为公共变量, 则它们既可供主模块使用也可供下级模块使用。因此, 当程序返回子模块sub1.prg时, 变量b的值则应为新值10;当返回主模块main.prg时, 变量a的值应为新值5。

2.2例2

有主程序main2.prg, 子程序sub2.prg如下图所示。执行主程序main2.prg, 屏幕弹出出错提示信息, 如下图所示。

由以上执行结果可知, 在主程序main2.prg中建立的本地变量, 其作用范围不包括下级模块, 因此在子程序sub2.prg中执行输出命令时会出现“找不到变量”的出错提示。

若将主程序main2.prg中建立本地变量的命令“LOCAL A, B, C”移到子程序sub2.prg中首行, 当子程序执行完毕返回主程序执行输出命令“?A, B, C”时, 依然会出现“找不到变量A”的出错提示。由此可知, 在子模块中建立的本地变量, 其作用范围也不包括上级模块。

2.3例3

有主程序main3.prg, 子程序sub3.prg如下图所示。运行主程序main3.prg, 结果如下图所示。

从程序运行结果可知, 变量a, b, c是在主模块main3.prg中隐含定义的私有变量, 其作用范围包括子模块sub3.prg, 则变量a, b, c可在子模块sub3.prg中使用。在子模块中为变量a, b, c分别进行重新赋值, 当返回主模块main3.prg时, 变量a, b, c的值应为新值5, 10, 100。

若在子程序sub3.prg的首行增加一条命令“PRI-VATE A”, 则程序执行结果会变成“1, 10, 100”。这是因为, 在主模块main3.prg中隐含定义了私有变量a, b c, 其作用范围本应包括子模块sub3.prg。但在子模块中显式定义了子模块的私有变量a, 则在调用子模块时, 主模块中的私有变量a因与子模块的私有变量a同名, 会被暂时屏蔽, 不能在子模块中使用。在子模块中, 为子模块的私有变量a赋值为5, 为主模块的私有变量b, c分别重新赋值为10, 100, 当返回主模块main3.prg时, 变量b, c的值为新值10, 100;主模块的私有变量a恢复使用, 但仍使用原值1。

2.4例4

有主程序main4.prg, 子程序sub4.prg如下图所示。执行主程序main4.prg, 结果如下图所示。

从程序运行结果可知, 在主模块main4.prg中建立了本地变量a, 其作用范围仅仅为主模块。主模块中同时还隐含定义了主模块的私有变量b, 其作用范围本来包括主模块及其下级子模块sub4.prg。但在子模块中显式定义了子模块的私有变量b, 则在调用子模块时, 主模块中的私有变量b因与子模块的私有变量b同名, 会被暂时屏蔽, 不能在子模块中使用。在子模块中, 同时还建立了公共变量c, 其作用域包括主模块;隐含定义了子模块的私有变量a, 其作用域为子模块及下级, 不能在主模块中使用。在子模块中还为其私有变量a赋值为5, 私有变量b赋值为10, 公共变量c赋值为100。当返回主模块main4.prg时, 子模块的私有变量a, b被释放, 主模块的本地变量a、私有变量b保留原值1和2。因公共变量c的作用域包括主模块, 则其值100在主模块中也可使用。

3 结束语

在VFP的过程调用中, 经常需要大量使用变量。这时, 不同过程中变量的作用范围就显得非常重要。如果处理不当, 变量间相互影响, 将给系统带来很大的隐患。给学生讲解这部分的时候应配合尽量简单的实例, 进行详尽的分析, 再辅以优秀的教学方法如任务驱动教学法[4]、项目教学法[5]等, 使之深入掌握, 以后在程序设计中对变量进行使用时才会做到游刃有余。

摘要:Visual FoxPro (VFP) 是用户收集信息、查询数据、创建集成数据库系统、进行实用系统开发较为理想的工具软件。但在进行过程调用时, 对于各类变量的正确理解及变量的作用域一直是学生学习的难点。文中对VFP过程调用中使用的三种变量进行了介绍, 并配以浅显易懂的实例分析, 以求加深学生对其作用范围的理解。

关键词:Visual FoxPro,变量,作用域

参考文献

[1]王静.在医学院校VisualFoxPro课程中开展任务驱动教学的构思[J].计算机时代, 2012 (10) :54-55.

[2]王利.二级教程—VisualFoxPro程序设计[M].高等教育出版社, 2006.

[3]周敏.大学计算机基础教程[M], 科学出版社, 2013.

[4]段青.“任务驱动”教学法的本质探析[J].中小学信息技术教育, 2002 (1) :72-74

谈谈C语言中的变量 篇2

程序设计的一项主要任务是对数据进行处理。编写程序时需要定义各种变量来存放数据。因此在所有的计算机高级语言程序中, 都存在着变量这样一个重要的概念。但与其他语言中的变量相比, 《C语言程序设计》 (以下简称C语言) 中变量这一知识点所包含的内容更为丰富, 包括变量的定义、数据类型、作用域、存储类别和存储方式等。其中有些知识点有一定的难度, 例如变量的本质、生存期和作用域、变量的同名等等。以下笔者对C语言中的变量及与变量相关的知识点做了一些总结, 希望能对初学者学好C语言有所帮助。

2 变量的概念

与数学中变量的概念一样, 是指问题中的名词或属性的取值。

在学习程序设计语言之前, 我们已经对计算机系统有了一个全面的了解, 在此基础上, 我们从计算机硬件层次对变量进行深层次的认识。计算机中的存储器以字节为单位划分成了很多空间, 是存放数据的基本场所。变量数据一般也存放在这些内存空间中, 对这些空间的使用, 系统是通过一个地址来进行的。你存入一个数据到地址2000中, 下次想再取出这个数据时, 只需要访问地址2000即可, 即通过内存地址找到特定的存储空间并对数据进行存取 (内存地址是一个二进制数, 随内存空间大小的不同其位数也不同) 。这就出现一个问题:编写程序时如何去记忆你所使用的那些内存单元?很显然, 记下每个内存单元的地址不是一个好的方法, 为了解决这个问题, 人们引入了变量来代替内存地址。你声明一个变量, 本质的意义是向系统要求一个存储空间。如果没有变量, 你可能就需要记下系统分给你的存储空间地址, 而有了变量之后, 你不需要再记下系统分给你的到底是哪个内存地址, 只用记住这个变量即可。往这个变量中写入数据, 就是往分给你的那个存储空间中写, 要读出存入的数据, 只用访问变量即可, 系统会自动并准确地找到那个存储地址并从中取出你需要的数据。所以在计算机硬件层次上, 变量的本质实际上就是内存中某块内存空间的名称。于是我们就可以理解为什么常量的值不可变而变量的值可变, 你可以多次往存储空间写东西, 但取出的永远是最后一个存入的数据。

这就是我们要说的变量:和常量不同, 变量就是在程序运行时其值可以发生变化的量。它的值是可变的;是取之不尽, 用之不竭的。一旦具有新值, 老值就不见了。每一个变量都有一个变量名, 由标识符表示。为变量起名时, 最好是见其名就能知其意。

在计算机硬件层次上对变量进行更深层次的认识是非常重要的。指针的学习就需要这方面的知识。所以, 想学好指针, 必须对变量的本质具有深刻的认识。

3 变量的定义和初始化

在C语言中, 使用任一变量前都必须进行定义。一个变量定义的完整格式如下 (花括号表示可省) :

{存储类型}数据类型变量名1{{=表达式1}, 变量名2{{=表达式2}, …, {变量名N{=表达式N}}}};

定义一个变量的过程实际上就是向内存申请一个符合该类数据类型的空间, 以后对变量的操作就代表了对对应内存空间的存取操作。

在这个定义中, 存储类型决定了变量存放在何处, 数据类型决定了这个变量所占的字节数, 变量名决定了这个变量在本程序中的名字, 表达式则决定了这个变量的初始值。使用变量之前应该给变量一个值, 一个好的编译程序将帮助我们发现那些还没有被给定一个值就被使用的变量。不过, 变量不一定需要初始化。在函数外部定义的变量或者在函数内部用static关键字定义的变量在没有明确地被程序初始化之前都已被系统初始化为0了。在函数内部或程序块内部定义的不带static关键字的变量都是自动变量, 如果没有明确地对这些变量进行初始化, 它们就会具有未定义值。如果没有对一个自动变量进行初始化, 在使用它之前就必须保证先给它赋值。

4 变量的数据类型

程序设计最基本的问题是解决对所要处理数据的描述。任何一个数据, 都有一个确定的表示形式、一个确定的值以及确定的所能参与的各种运算, 这就是数据类型。程序中变量的本质表现在存在时间和占用空间这两个方面。变量的数据类型决定了变量占用的存储空间。它受类型说明语句的制约。任一变量都必须具有确定的数据类型。不管变量怎样变化, 其值都必须符合该类数据类型的规定。

5 变量的存储类型

5.1 变量的存储类型

变量的存储类型决定变量作用的有效时间和范围。它受类型说明语句位置的制约。

变量作用的有效范围称为变量的作用域。变量作用的有效时间称为变量的生存期。变量的作用域指出了变量在什么范围内有效, 这种有效指的是在非作用域中引用该变量会直接导致编译错误;变量的生存周期指明了变量的存活期, 它从系统为变量分配内存空间开始, 到系统收回此内存空间为止, 同样, 在变量的生存周期范围以外引用该变量也会导致编译错误。

前面讲了变量的类型说明语句决定了变量的存储类型;变量的说明语句位置决定了变量的存在时间, 因而将变量分为全局变量和局部变量。

全局变量:在所有函数体之外定义的变量属于全局变量。它有三个特征:

作用域:在定义开始之后的所有函数中;

生存期:从程序开始到程序结束的全部时间;

使用要求:全局变量不能与程序的任何函数中的变量名 (局部变量) 同名, 若同名, 则全局变量在该函数中不起作用。

局部变量:在函数内部定义的变量属于局部变量。局部变量仅由其被定义的模块内部的语句所访问。对于局部变量有几个特征:

作用域:只在定义变量的函数内;

生存期:在函数被调用时产生, 函数调用结束后消失。

使用特点:不同函数中的局部变量互不干涉, 即使是同名的局部变量, 彼此之间是相互独立的;在函数中使用了和全局变量同名的局部变量, 则在该函数中局部变量有效。

5.2 可控的存储类型

全局变量和局部变量的性质, 是由编译技术的存储分配决定的。C语言创造了一种机制, 能让用户强行改变变量的存储类型, 这种机制称为可控的存储类型, 以下分别介绍这四种可控的存储类型。

5.2.1 自动存储类型。自动存储类型说明符:auto。

C语言的编译系统对程序中所有未加存储类型说明的局部变量都默认为自动存储类型。函数中的形参和在函数中定义变量 (包括复合语句中定义的变量) 都属此类。自动存储类型的局部变量 (也叫自动变量) 使用时注意以下几点:

1) 只在定义它的函数被调用时, 系统才给它分配存储空间, 调用结束, 它所占的存储空间也被释放;

2) 作用域仅限于它所在的函数体或符合语句体;

3) 在函数体内使用一个局部变量之前必须为它设定初值。

5.2.2 寄存器存储类型。寄存器存储类型说明符:register。

寄存器存储类型是C语言的一大特点。寄存器是C P U的一部分, 直接将变量数据存放在寄存器中, 节省了数据从内存到运算器以及从运算器到内存的传送时间。可以加快程序的运行速度, 但是由于寄存器与机器的硬件有关, 所以系统对寄存器的使用有若干限制。

定义寄存器变量时应注意:只有自动变量和函数的形式参数能被定义为寄存器存储类型;寄存器变量的数据类型只能是整型、字符型或指针型;寄存器的数目是有限的, 决定了寄存器变量的个数是有限的, 建议用一两个即可。

5.2.3 静态存储类型。静态存储类型说明符:static。

静态局部变量:在局部变量的说明前加上static就是静态局部变量。它具有以下特点:生存期是整个源程序。也就是说即使函数调用结束后, 它所占用的存储空间也不释放, 其值一直存在, 下一次调用时继续使用;静态局部变量的生存期虽然为整个源程序, 但是其作用域仍与自动变量相同, 即其它函数不能引用它;若静态局部变量未赋初值, 则由系统自动赋初值为0 (数值型变量) 或‵ (字符变量) 。

静态全局变量:全局变量的说明之前加上以static就构成了静态全局变量。全局变量和静态全局变量的区别在于:当一个源程序由多个源文件组成时, 全局变量的作用域是整个源程序, 即在各个源文件中都是有效的。而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。

5.2.4 外部存储类型。外部存储类型说明符:extern。

全局变量的作用域是从定义的位置开始到源程序文件的末尾。有时需要扩展其作用域, 可以用extern进行声明。

6 结束语

变量在程序设计中使用最为频繁, 但是它所涉及到的知识点又特别多, 本文就变量的特点进行了总结归纳, 希望对初学者有所帮助。

摘要:从计算机硬件层次上对变量进行了分析, 重点讨论了变量的概念、定义、数据类型和存储类型。

关键词:C语言,变量,数据类型,存储类型

参考文献

[1]谭浩强.C语言程序设计[M].第2版.北京:清华大学出版社.2000:172-176

C语言中变量的作用域 篇3

1 导课

循环结构需要学生抽象思维,为了抓住学生兴趣和学习劲头,需要设计一下导课环节。因为前一节课学过了C语言的while,do---while,for三种循环格式,所以这样安排循环嵌套的导课环节。先给学生出一道题 :要求学生利用上节知识输出如下式子 :

1×1=1 1×2=2 1×3=3 1×4=41×5=5 1×6=6 1×7=7 1×8=8 1×9=9

学生根据上节课知识点很快就会写出对应的程序,然后把式子改成这样 :

1×1=1 1×2=2 1×3=3 1×4=41×5=5 1×6=6 1×7=7 1×8=81×9=9

2×1=1 2×2=4 2×3=6 2×4=82×5=10 2×6=12 2×7=14 2×8=162×9=18

……

9×1=9 9×2=18 9×3=27 9×4=369×5=45 9×6=54 9×7=63 9×8=729×9=81

启发学生一行式子可以利用循环来完成,那么九行这样的式子怎么办呢?这就是我们这节课要学习的内容,学完这节课,我们就能解决这个问题,由此导入本节课的知识点。

2 嵌套的定义及格式

2.1 嵌套的定义

如果一个循环体中又包含另一个完整的循环结构,则称为双循环嵌套。

2.2 嵌套的格式

while、do—while、for三种循环可以各自嵌套,也可以互相嵌套。

嵌套形式如图 :

2.3 典型应用

输出简单的几何图形,是循环结构的典型应用。如图 :

3 分析程序,找出“三变量”

根据以往的教学经验,学生对双循环一般很难理解,所以本人在实际教学中总结出寻找“三变量”方法,解决此类循环嵌套问题,只需要找到三个变量(行变量i,空格变量k和列变量j)即可,可以让学生轻而易举的解决双循环问题。

以此图为例。

分析 :

此类图形问题,可以这样比喻理解。第一行相当于来了第一个体育老师,让你跑一圈,第二行相当于来了第二个体育老师,让你先做一个仰卧起坐,然后跑两圈,第三行相当于来了第三个体育老师,让你先做两个仰卧起坐,然后跑三圈,依次类推,找寻规律,来了第i个体育老师,你会做i-1个仰卧起坐,跑i圈。

用C语言专业术语来说,体育老师个数相当于行数,仰卧起坐个数相当于空格个数,跑圈数相当于输出 # 号的个数。分别用i表示行,k表示空格,j表示 # 号,解决图形问题,只需找出此三变量即可。

1. 先找行变量i

此图一共3行,所以i值得变化从1到3,for(i=1; i<=3; i++)

2. 再找空格变量k

由图形分析,列出每行的空格值,从而推出k与i的关系。

因为k与i是i-1的关系,所以得出变量k,for(k=1;k<=i-1;k++)

3. 最后找列变量 j

由图形分析,列出每行的列值,从而推出j与i的关系。

因为j与i是相等的关系,所以得出变量j,for(j=1;j<=i;j++)。

根据图形分析,每行结束后需换行,即加一个printf“(n”); 一共i行,所以循环i次。

4 写出程序

void main()

{ int i,j,k; /* 定义三个变量

for(i=1;i<=3;i++) /* 行变量

{ for(k=1;k<=i-1;k++) /* 空格变量

printf“(”); /* 输出空格

for(j=1;j<=i;j++) /* 列变量

printf“(#”); /* 输出 # 号

printf“(n”); } /* 换行

}

5 用本节所学解决引例问题

引例中的九九乘法表,相当于来了九个体育老师,每个体育老师没让做仰卧起坐,只跑了九圈,所以这里的k变量可以省略了,只需找出i和j变量即可,一共九行,所以for(i=1;i<=9;i++),每行九列,for(j=1;j<=i;j++),所以程序如下 :

mai(n)

{ int i,j;

for(i=1;i<=9;i++)

{for(j=1;j<=i;j++)

printf“(%d*%d=%d”,i,j,i*j);

printf“(n”); }

}

上一篇:艺术家的特权下一篇:航磁异常