《Linux C一站式学习》第三章 简单的函数
2011-11-27 14:56
267 查看
4. 全局变量、局部变量和作用域
全局变量定义在所有的函数体之外,它们在程序开始运行时分配存储空间,在程序结束时释放存储空间,在任何函数中都可以访问全局变量。
如果全局变量和局部变量重名了会怎么样呢?
例 3.6. 作用域
![](http://learn.akae.cn/media/images/func.scope.png)
则第一次调用
设想整个源文件是一张大纸,也就是全局变量的作用域,而
局部变量可以用类型相符的任意表达式来初始化,而全局变量只能用常量表达式(Constant Expression)初始化。例如,全局变量
但这样初始化是不合法的:
然而局部变量这样初始化却是可以的。程序开始运行时要用适当的值来初始化全局变量,所以初始值必须保存在编译生成的可执行文件中,因此初始值在编译时就要计算出来,然而上面第二种Initializer的值必须在程序运行时调用
虽然在编译时计算出
如果全局变量在定义时不初始化则初始值是0,如果局部变量在定义时不初始化则初始值是不确定的。所以,局部变量在使用之前一定要先赋值,如果基于一个不确定的值做后续计算肯定会引入Bug。
例 3.7. 验证局部变量存储空间的分配和释放
结果是:
修改一下
结果是:
非定义的函数声明也可以写在局部作用域中,例如:
这样声明的标识符
虽然在一个函数体中可以声明另一个函数,但不能定义另一个函数,C语言不允许嵌套定义函数。
全局变量定义在所有的函数体之外,它们在程序开始运行时分配存储空间,在程序结束时释放存储空间,在任何函数中都可以访问全局变量。
如果全局变量和局部变量重名了会怎么样呢?
例 3.6. 作用域
![](http://learn.akae.cn/media/images/func.scope.png)
则第一次调用
print_time打印的是全局变量的值,第二次直接调用
printf打印的则是
main函数局部变量的值。
设想整个源文件是一张大纸,也就是全局变量的作用域,而
main函数是盖在这张大纸上的一张小纸,也就是
main函数局部变量的作用域。在小纸上用到标识符
hour和
minute时应该参考小纸上的定义,因为大纸(全局变量的作用域)被盖住了,如果在小纸上用到某个标识符却没有找到它的定义,那么再去翻看下面的大纸上有没有定义,例如上图中的变量
x。
局部变量可以用类型相符的任意表达式来初始化,而全局变量只能用常量表达式(Constant Expression)初始化。例如,全局变量
pi这样初始化是合法的:
double pi = 3.14 + 0.0016;
但这样初始化是不合法的:
double pi = acos(-1.0);
然而局部变量这样初始化却是可以的。程序开始运行时要用适当的值来初始化全局变量,所以初始值必须保存在编译生成的可执行文件中,因此初始值在编译时就要计算出来,然而上面第二种Initializer的值必须在程序运行时调用
acos函数才能得到,所以不能用来初始化全局变量。请注意区分编译时和运行时这两个概念。为了简化编译器的实现,C语言从语法上规定全局变量只能用常量表达式来初始化,因此下面这种全局变量初始化是不合法的:
int minute = 360;int hour = minute / 60;
虽然在编译时计算出
hour的初始值是可能的,但是
minute / 60不是常量表达式,不符合语法规定,所以编译器不必想办法去算这个初始值。
如果全局变量在定义时不初始化则初始值是0,如果局部变量在定义时不初始化则初始值是不确定的。所以,局部变量在使用之前一定要先赋值,如果基于一个不确定的值做后续计算肯定会引入Bug。
例 3.7. 验证局部变量存储空间的分配和释放
#include <stdio.h> void foo(void) { int i; printf("%d\n", i); i = 777; } int main(void) { foo(); foo(); return 0; }
结果是:
134518128 777
修改一下
int main(void) { foo(); printf("hello\n"); foo(); return 0; }
结果是:
134518200 hello 0
非定义的函数声明也可以写在局部作用域中,例如:
int main(void) { void print_time(int, int); print_time(23, 59); return 0; }
这样声明的标识符
print_time具有局部作用域,只在
main函数中是有效的函数名,出了
main函数就不存在
print_time这个标识符了。
虽然在一个函数体中可以声明另一个函数,但不能定义另一个函数,C语言不允许嵌套定义函数。
相关文章推荐
- 《Linux C一站式学习》第三章 简单的函数
- 《Linux C一站式学习》第三章 简单的函数
- 《Linux C一站式学习》第三章 简单的函数
- Flex3学习轨迹:缓动函数简单实现
- 驱动程序学习(二)一个简单的字符型设备驱动函数
- Linux之module_param()函数学习
- .Net程序员学习Linux最简单的方法
- linux学习——简单串口通信
- Linux下getopt()函数的简单使用
- linux的进程相关函数简单总结
- 在linux系统下,简单实现类似windows的_splitpath函数的功能
- Linux获取文件属性stat()、fstat()、lstat()函数实例学习
- Linux下getopt()函数的简单使用
- Linux netfilter 学习笔记 之二 ip 层netfilter的hook 注册以及执行hook函数的概要分析
- Linux学习笔记:简单了解用户,对用户的简单操作
- 【Linux学习笔记】栈与函数调用惯例 http://blog.csdn.net/xiaogugood/article/details/38490663
- linux应用编程--简单常用函数
- linux-redis学习经历一,安装和简单使用
- 报文的发送函数 (linux网络子系统学习 第十三节)
- Linux netfilter 学习笔记 之二 ip 层netfilter的hook 注册以及执行hook函数的概要分析