内容正文:
第6章 函数与编译预处理
本章内容
6.1模块化设计
6.2函数的定义与调用
6.3函数的递归调用
6.4 变量的存储类型、作用域
6.5 编译预处理
6.6 综合案例
6.4 变量的存储类型、作用域
6.4.1变量的作用域
局部变量
函数内作定义说明的,其作用域仅限于函数内部
注意问题:
主函数中定义的变量也只能在主函数中使用,不能在其它函数中使用
形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量
允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆
全局变量
在函数外部定义的变量,也就是在程序的开头声明
全局变量定义形式为:
[extern] 类型说明符 变量名,变量名…
extern可以省去不写
例如:
int a,b;
等效于:
extern int a,b;
注意问题:
全局变量在定义时就已分配了内存单元,全局变量定义可作初始赋值,全局变量说明不能再赋初始值,只是表明在函数内要使用某全局变量
全局变量可加强函数模块之间的数据联系,但同时也降低了函数的独立性。
在同一源文件中,允许全局变量和局部变量同名。在局部变量的作用域内,全局变量不起作用。
程序举例
#include "stdio.h"
int a=8,b=4; /*定义全局变量a,b*/
void fun()
{
int a,b; /*定义局部变量a,b*/
a=10;
b=5;
printf("fun:a+b=%d
",a+b);
}
main()
{
fun();
printf(“main:a+b=%d
”,a+b);
}
上例的输出结果为:
fun:a+b=15
main:a+b=12;
6.4.2 变量的存储类型
静态存储
在变量定义时就分配存储单元并一直保持不变,直至整个程序结束
分类
静态(static)
外部(extern)
动态存储
在程序执行过程中,使用它时才分配存储单元,使用完毕立即释放
分类
自动(auto)
寄存器(regiser)
自动变量
定义的一般形式为:
[auto] 类型标识符 变量列表
其中,auto可以省略
自动变量的特点
作用域仅限于定义该变量的结构内
自动变量属于动态存储方式,只有在使用它,即定义该变量的函数被调用时才给它分配存储单元,开始它的生存期
不同的结构中允许使用同名的变量而不会混淆
静态变量
定义的一般形式为:
static 类型标识符 变量列表
例如:static int a;
分类
静态局部变量
静态局部变量的作用域仅局限于声明它的语句块中,但是在程序执行期间,变量将始终保持它的值
静态全局变量
静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包含多个文件,静态全局变量只能作用于定义它的文件里,不能在其它文件里引用该变量
程序举例
#include <stdio.h>
int add()
{
static int a=10; /*定义静态局部变量,并赋初值*/
a+=10;
return a;
}
main()
{
int i;
for(i=1;i<=5;i++)
printf("%d.add=%d
",i,add());
}
运行上面的程序,输出的结果为:
1.add=20
2.add=30
3.add=40
4.add=50
5.add=60
外部变量
声明外部变量的一般形式为:
extern 类型标识符 变量列表
例如:
/*f1.c*/
#include <stdio.h>
main()
{
extern int num; /*声明外部变量num,表明在函数中将用到外部变量num*/
init();
printf("num=%d
",num);
}
/*f2.c*/
int num; /*定义全局变量num*/
void init()
{
num=100;
}
寄存器变量
定义的一般形式为:
register 类型标识符 变量列表
作用:让程序员指定某个局部变量存放在计算机的某个硬件寄存器里而不是内存中,以提高程序的运行速度
寄存器变量除了程序无法得到其地址外,其余都和自动变量一样
6.5 编译预处理
6.5.1 宏定义
6.5.2 文件包含
6.5.3 条件编译
6.5.1 宏定义
宏定义的功能是用一个标识符来表示一个字符串,标识符称为宏名
无参宏
无参宏定义的一般形式为:
#define <标识符> <字符串>
例如: # define EX (x*y+z)
注意事项:
在宏代换时,只是简单的将宏名代换为相应的表达式 ,注意括号的使用
宏定义是用宏名来表示一个字符串,在宏代换时又以该字符串简单的替换宏