今天学习内容如下:
- 8.8 局部变量和全局变量
- 局部变量:在函数内部或块内定义的变量,只在其定义的函数或块内有效。
- 全局变量:在函数外部定义的变量,从定义位置到文件结束都有效。
- 局部变量和全局变量的区别:作用域、存储方式和生存期不同。
- 建议尽量少使用全局变量,以降低程序的通用性和可靠性。
- 8.9 变量的存储类别
- 自动变量(auto):默认的存储类别,在进入函数或块时自动分配内存,退出时自动释放。
- 静态变量(static):用关键字
static
声明,在程序运行期间一直存在,只初始化一次。 - 寄存器变量(register):将变量存储在寄存器中,提高访问速度,但数量有限。
- 外部变量(extern):用于在多个文件中共享变量。
- 8.10 内部函数和外部函数
- 内部函数(static):只能在本文件中使用的函数。
- 外部函数(默认):可以被其他文件调用的函数。
-
在C语言中,预处理命令是在编译之前对程序进行特殊处理的命令,它不是C语言本身的组成部分。C语言提供的预处理功能主要有宏定义、文件包含和条件编译。
一、宏定义
- 不带参数的宏定义
- 定义形式:
#define 标识符 字符串
- 作用:在程序中用指定的标识符代替字符串,减少重复书写,提高通用性。
- 注意事项:宏名一般用大写字母,不作正确性检查,不加分号,有效范围为定义命令之后到本源文件结束,可用
#undef
命令终止其作用域,可层层置换,对双撇号内的字符不进行置换,不分配内存空间。
- 定义形式:
- 带参数的宏定义
- 定义形式:
#define 宏名(参数表) 字符串
- 展开方式:将语句中的宏名后面括号内的实参字符串代替
#define
命令行中的形参,若字符串中包含宏中的形参,则将程序语句中相应的实参代替形参,非参数字符保留。 - 与函数的区别:函数调用时先求实参表达式的值再代入形参,且为形参分配临时内存单元,有类型要求,只返回一个值;而宏定义只是简单的字符替换,不分配内存单元,无类型问题,可得到多个结果,不占运行时间。
- 定义形式:
-
二、文件包含
- 定义:一个源文件将另一个源文件的全部内容包含进来。
- 一般形式:
#include "文件名" 或 #include <文件名>
- 作用:节省重复劳动,提高程序通用性。
- 注意事项:一个
#include
命令只能指定一个被包含文件;被包含文件修改后,所有包含它的文件都要重新编译;文件包含可嵌套;文件名用尖括号或双撇号括起来,二者区别在于查找文件的方式不同;被包含文件与其所在文件在预编译后成为同一个文件,被包含文件中的全局静态变量在包含它的文件中有效,不必用extern
声明。 -
三、条件编译
- 作用:根据条件编译不同的代码段,提高程序的通用性和灵活性。
- 形式:
#ifdef 标识符 程序段1 #else 程序段2 #endif
:若标识符已被定义,则编译程序段1,否则编译程序段2。#ifndef 标识符 程序段1 #else 程序段2 #endif
:若标识符未被定义,则编译程序段1,否则编译程序段2。#if 表达式 程序段1 #else 程序段2 #endif
:当表达式值为真时编译程序段1,否则编译程序段2。
-
本章介绍的预编译功能有利于程序的可移植性和灵活性,掌握这些功能可以使程序更加简洁、高效。
在最后我们做了一个小项目,虽然有小问题,但都被解决了,很充实。