目录
9.1 局部变量
一、定义
在函数体内声明的变量称为局部变量
二、性质
(一) 具有自动存储期限
当包含局部变量的函数返回时,局部变量的值无法保留,即:再次调用该函数时,无法保证变量仍拥有原先的值
(二) 具有块作用域
1° 含义:可以引用该变量的程序文本的部分
2° 范围:从变量声明的点一直到所在函数体的末尾(局部变量的作用域不可延伸到其所属函数之外)
三、静态局部变量
(一) 格式
static 类型名 变量名称
(二) 特殊性质
具有静态存储期限而没自动存储期限
当包含静态局部变量的函数返回时,该变量的值将被保留,即:再次调用该函数时,该变量仍拥有原先的值
四、形参与局部变量的异同
(一) 异
在每次函数调用时对形参自动进行初始化(调用中通过赋值获得相应实参的值)
(二) 同
形参拥有和局部变量一样的性质
9.2 全局变量(外部变量)
一、定义
在任何函数体外声明的变量称为全局变量
二、性质
(一) 具有静态存储期限
当含全局变量的函数返回时,该变量的值将被保留
(二) 具有文件作用域
1°含义:可以引用该变量的程序文本的部分
2°范围:从变量被声明的点开始一直到所在文件的末尾 (跟随在全局声明后的所有函数都可访问并修改)
三、利弊
(一) 利
在多个函数必须共享一个变量或少数几个函数共享大量变量时,使用全局变量很是方便
(二) 弊
1°在程序维护期间,若改变全局变量(如改变其类型),则将需要检查同一文件中的每个函数,以确定该变化如何对函数产生影响
2°若全局变量被赋予了错误的值,则可能很难确定出错的函数
3°很难在其他程序中再次使用依赖于全局变量的函数 (由于依赖全局变量的函数并不 “独立”,在另一个程序中使用该函数必须带上此函数所需的全局变量)
4°当许多C程序员过于依赖全局变量时,会出现一个普遍陋习:
在不同函数中为不同目的使用同一全局变量而非不同局部变量,使该变量对所有函数均可见,且会产生误导:阅读者可能认为变量的使用彼此关联(而实 际上不是)
四、注意事项
使用全局变量时,要确保它们都拥有有意义的名称
(局部变量不是总需要有意义的名称,因为往往很难为for循环中的控制变量起一个比 "i" 更好的名称)
五、作用之一
实现栈 (stack)
9.3 程序块
一、含义
由一组大括号 " {} " 括起来的语句
二、作用
用于定义变量的作用域、控制变量的生命周期以及组织代码逻辑
三、注意事项
C99允许在程序块的任何地方声明变量
9.4 作用域
一、含义
某变量的作用域指可以引用该变量的程序文本的部分
二、分类
(一) 程序块作用域
(二) 文件作用域
(三) 函数作用域
(四) 函数原型作用域
三、重要规则之一
当程序块内的声明命名一个标识符时,若此标识符已经是可见的(因为此标识符拥有文件作用域或某块作用域 ),新的声明临时“隐藏”了旧的声明,标识符获得了新的含义,且在程序块末尾,标识符重新获得旧的含义
9.5 构建C程序
一、最常见的编排顺序
#include 指令 #define 指令 类型定义 全局变量的声明 除 main 函数之外的函数原型 main 函数的定义 其他函数的定义
二、建议
在每个函数定义前或每个函数原型前放盒型注释,给出函数名、函数目的、每个形参含义、返回值及所有副作用