欢迎来到天天文库
浏览记录
ID:14636110
大小:55.00 KB
页数:7页
时间:2018-07-29
《1c语言入门_3简单函数_4全局变量、局部变量和作用域》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第 3 章 简单函数4. 全局变量、局部变量和作用域我们把函数中定义的变量称为局部变量(LocalVariable),由于形参相当于函数中定义的变量,所以形参也是一种局部变量。在这里“局部”有两层含义:1、一个函数中定义的变量不能被另一个函数使用。例如print_time中的hour和minute在main函数中没有定义,不能使用,同样main函数中的局部变量也不能被print_time函数使用。如果这样定义:voidprint_time(inthour,intminute){printf("%d:%d
2、",hour,minute);}intmain(void){inthour=23,minute=59;print_time(hour,minute);return0;}main函数中定义了局部变量hour,print_time函数中也有参数hour,虽然它们名称相同,但仍然是两个不同的变量,代表不同的存储单元。main函数的局部变量minute和print_time函数的参数minute也是如此。2、每次调用函数时局部变量都表示不同的存储空间。局部变量在每次函数调用时分配存储空间,在每次函数返回时释
3、放存储空间,例如调用print_time(23,59)时分配hour和minute两个变量的存储空间,在里面分别存上23和59,函数返回时释放它们的存储空间,下次再调用print_time(12,20)时又分配hour和minute的存储空间,在里面分别存上12和20。与局部变量的概念相对的是全局变量(GlobalVariable),全局变量定义在所有的函数体之外,它们在程序开始运行时分配存储空间,在程序结束时释放存储空间,在任何函数中都可以访问全局变量,例如:例 3.5. 全局变量#include
4、tdio.h>inthour=23,minute=59;voidprint_time(void){printf("%d:%dinprint_time",hour,minute);}intmain(void){print_time();printf("%d:%dinmain",hour,minute);return0;}正因为全局变量在任何函数中都可以访问,所以在程序运行过程中全局变量被读写的顺序从源代码中是看不出来的,源代码的书写顺序并不能反映函数的调用顺序。程序出现了Bug往往就是因为在某个不
5、起眼的地方对全局变量的读写顺序不正确,如果代码规模很大,这种错误是很难找到的。而对局部变量的访问不仅局限在一个函数内部,而且局限在一次函数调用之中,从函数的源代码很容易看出访问的先后顺序是怎样的,所以比较容易找到Bug。因此,虽然全局变量用起来很方便,但一定要慎用,能用函数传参代替的就不要用全局变量。如果全局变量和局部变量重名了会怎么样呢?如果上面的例子改为:例 3.6. 作用域则第一次调用print_time打印的是全局变量的值,第二次直接调用printf打印的则是main函数局部变量的值。在C语言中
6、每个标识符都有特定的作用域,全局变量是定义在所有函数体之外的标识符,它的作用域从定义的位置开始直到源文件结束,而main函数局部变量的作用域仅限于main函数之中。如上图所示,设想整个源文件是一张大纸,也就是全局变量的作用域,而main函数是盖在这张大纸上的一张小纸,也就是main函数局部变量的作用域。在小纸上用到标识符hour和minute时应该参考小纸上的定义,因为大纸(全局变量的作用域)被盖住了,如果在小纸上用到某个标识符却没有找到它的定义,那么再去翻看下面的大纸上有没有定义,例如上图中的变量x。
7、到目前为止我们在初始化一个变量时都是用常量做Initializer,其实也可以用表达式做Initializer,但要注意一点:局部变量可以用类型相符的任意表达式来初始化,而全局变量只能用常量表达式(ConstantExpression)初始化。例如,全局变量pi这样初始化是合法的:doublepi=3.14+0.0016;但这样初始化是不合法的:doublepi=acos(-1.0);然而局部变量这样初始化却是可以的。程序开始运行时要用适当的值来初始化全局变量,所以初始值必须保存在编译生成的可执行文件中
8、,因此初始值在编译时就要计算出来,然而上面第二种Initializer的值必须在程序运行时调用acos函数才能得到,所以不能用来初始化全局变量。请注意区分编译时和运行时这两个概念。为了简化编译器的实现,C语言从语法上规定全局变量只能用常量表达式来初始化,因此下面这种全局变量初始化是不合法的:intminute=360;inthour=minute/60;虽然在编译时计算出hour的初始值是可能的,但是minute/60不是常量表达式,不符合
此文档下载收益归作者所有