C程序设计 谭浩强 著 清华大学出版社.

Slides:



Advertisements
Similar presentations
普通高等学校 本科教学工作水平评估方案.
Advertisements

电子成绩单项目实现.
Tool Command Language --11级ACM班 金天行.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
在PHP和MYSQL中实现完美的中文显示
EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则
4.3函数 4.3.1函数的概念及定义 1、函数的概念: 可以被其它程序调用具有 特定功能的一段相对独立的 程序(模块),称函数。
第八章 函数 §8.1 概述 一个较大程序一般分为若干个程序模块,每一个模块实现一个特定的功能。所有的高级语言中都有子程序的概念,在C中子程序就是函数。 一个C程序可由一个主函数和若干个函数构成,由主函数调用其它函数,其它函数也可以相互调用.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
第13章 编译预处理 宏定义 文件包含 条件编译.
第10章 预处理过程 一、编译预处理指令概述 二、预处理指令 #include 三、#define指令.
程序设计专题一 结构化程序设计与递归函数 主讲教师: 刘新国.
走进编程 程序的顺序结构(二).
辅导课程六.
第7章 编译预处理 本章要求: 本章重点: 本章难点: 掌握用#define定义无参数宏和带有参数宏定义和调用方法;
程序设计基础.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
期中考试成绩分布 《程序设计》-2017年秋.
第二章 Java语言基础.
第3章 顺序结构程序设计 为了让计算机处理各种数据,首先就应该把源数据输入到计算机中;计算机处理结束后,再将目标数据信息以人能够识别的方式输出。C语言中的输入输出操作,是由C语言编译系统提供的库函数来实现。 3.1 格式化输出——printf()函数 3.2 格式化输入——scanf()函数.
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
2.1 C语言的数据类型 2.2 常量与变量 2.3 变量赋初值 2.4 各类数值型数据间的混合运算 2.5 C语言的运算符和表达式
第12章 编译预处理 12.1 了解编译预处理 12.2 宏 定 义 12.3 文 件 包 含 12.4 条 件 编 译.
第八章 编译预处理 西安工程大学.
程序设计专题一 结构化程序设计与递归函数 主讲教师: 刘新国.
第6章 预 处 理.
第九章 预处理命令.
第一章 函数与极限.
Visual Studio 2010简捷入门.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
第8章 编绎和预处理.
1.3 C语言的语句和关键字 一、C语言的语句 与其它高级语言一样,C语言也是利用函数体中的可执行 语句,向计算机系统发出操作命令。按照语句功能或构成的不 同,可将C语言的语句分为五类。 goto, return.
C语言程序设计 主讲教师:陆幼利.
$9 泛型基础.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
第1章 c++概述 1.1 C++语言的简史及特点 1.2 简单的C++程序 1.3 C++语言的基本组成
C语言程序设计 教案 崔武子制作
C语言程序设计 第九章 预处理命令.
<编程达人入门课程> 本节内容 内存的使用 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
C语言程序设计 第一章 数据类型, 运算符与表达式 第二章 顺序程序设计 第三章 选择结构程序设计 第四章 循环控制 第五章 数组.
第十四章 若干深入问题和C独有的特性 作业: 函数指针 函数作参数 函数副作用 运算 语句 位段 存储类别 编译预处理
第4章 Excel电子表格制作软件 4.4 函数(一).
C语言程序设计 李祥 QQ:
第七单元 应用函数程序设计 从现在开始,将详细讲述C语言的方方面面。第一章中的所有疑惑,都将一一消灭。
目录 8.1 宏定义 8.2 文件包含 8.3 条件编译 1.
第九节 赋值运算符和赋值表达式.
第2章 数据类型、运算符与表达式 本章要点: 基本数据类型 常量和变量 算术运算符和算术表达式 关系运算符和关系表达式
第6章 预 处 理.
3.16 枚举算法及其程序实现 ——数组的作用.
本节内容 结构体 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第8章 编译预处理 所谓编译预处理是指,在对源程序进行编译之前,先对源程序中的编译预处理命令进行处理;然后再将处理的结果,和源程序一起进行编译,以得到目标代码。 8.1 宏定义与符号常量 8.2 文件包含 8.3 条件编译 [Return]
C程序设计.
第2章 数据类型与表达式 学习目的与要求: 掌握C 语言的基本数据类型及使用方法 掌握C程序中常用的运算符和表达式 了解数据类型的转换.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
第4章 顺序结构程序设计 为了让计算机处理各种数据,首先就应该把源数据输入到计算机中;计算机处理结束后,再将目标数据信息以人能够识别的方式输出。C语言中的输入输出操作,是由C语言编译系统提供的库函数来实现。 4.1 格式化输出——printf()函数 4.2 格式化输入——scanf()函数.
第9章 预处理命令.
第7章 模板 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
第18讲 从C到C++ 计算机与通信工程学院.
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
顺序结构程序设计 ——关于“字符串”和数值.
本节内容 指针类型 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
编译原理实践 6.程序设计语言PL/0.
第二次课后作业答案 函数式编程和逻辑式编程
THE C PROGRAMMING LANGUAGE
计算机编程 信息管理与工程学院 2014年9月.
Presentation transcript:

C程序设计 谭浩强 著 清华大学出版社

C程序设计 第九章 预处理命令 概述   预处理是C语言的一个重要功能,它由预处理程序负责完成。当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。   以“#”号开头的预处理命令。如包含命令#include,宏定义命令#define等。在源程序中这些命令都放在函数之外,而且一般都放在源文件的前面,它们称为预处理部分。

C程序设计 第九章 预处理命令 目录 宏定义 文件包含 条件编译 本章小结 本章结束

9.2 宏定义 9.2.1 无参宏定义 无参宏的宏名后不带参数。 其定义的一般形式为: #define 标识符 字符串 【例9.1】 C程序设计 第九章 预处理命令 9.2 宏定义 9.2.1 无参宏定义 无参宏的宏名后不带参数。 其定义的一般形式为: #define 标识符 字符串 【例9.1】 【例9.2】 例如:#define PI 3.1415926 其中的“#”表示这是一条预处理命令。凡是以“#”开头的均为预处理命令。“define”为宏定义命令。“标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。

9.2 宏定义 9.2.2 带参宏定义 对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。 带参宏定义的一般形式为: C程序设计 第九章 预处理命令 9.2 宏定义 9.2.2 带参宏定义 对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。 带参宏定义的一般形式为: #define 宏名(形参表) 字符串 如:#define S(a,b) a*b area=S(3,2); 在字符串中含有各个形参。 带参宏调用的一般形式为: 宏名(实参表); 【例9.3】 返回主菜单

例9.1 #define PI 3.1415926 main() {float l,s,r,v; C程序设计 第九章 预处理命令 例9.1 #define PI 3.1415926 main() {float l,s,r,v; printf("input radius:"); scanf("%f",&r); l=2.0*PI*r; s=PI*r*r;v=4.0/3*PI*r*r*r; printf("l=%10.4f\ns=%10.4f\nv=%10.4f\n",l,s,v); } 输出: input radius:4 l= 25.1327 s= 50.2655 v= 268.0826 说明 运行程序

无参宏定义说明 1)宏名一般习惯用大写字母表示,以便与变量名相区别。但这并非规定,也可用小写字母。 2)宏定义是用宏名来表示一个字符串。 3)在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。 4)宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。

无参宏定义说明(续) 5)#define命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束,通常#define命令写在文件开头。 6)宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用# undef命令。 例如: #define PI 3.14159 main() { …… } #undef PI f1() 表示PI只在main函数中有效,在f1中无效。

无参宏定义说明(续) 7)在进行宏定义时,可以引用已定义的宏名,可以层层置换。 8)对程序中引用双撇号括起来的字符串内的字符,即使与宏名相同,也不进行置换。 9)宏定义是专门用于预处理命令的一个专门名词,它与定义变量的含义不同,只作字符替换,不分配内存空间。

例9.2 #define R 3.0 #define PI 3.1415926 #define L 2*PI*R C程序设计 第九章 预处理命令 例9.2 #define R 3.0 #define PI 3.1415926 #define L 2*PI*R #define S PI*R*R main() { printf("L=%f\nS=%f\n",L,S); } 输出: L=18.849556 S=28.274333 运行程序

例9.3 #define PI 3.1415926 #define S(r) PI*r*r main() {float a,area; C程序设计 第九章 预处理命令 例9.3 #define PI 3.1415926 #define S(r) PI*r*r main() {float a,area; a=3.6; area=S(a); printf("r=%f\narea=%f\n",a,area); } 说明 输出: r=3.600000 area=40.715038 运行程序

带参宏定义说明 对于带参的宏定义有以下问题需要说明: 1)对带参数的宏展开只是将语句中的宏名后面括号内的实参字符串代替#difine命令行中的形参。 2)在宏定义时,宏名和形参表之间不能有空格出现。 3)对函数中的实参和形参都要定义类型,二者的类型要求一致,如不一致,应进行类型转换。而宏不存在类型问题,宏名无类型,它的参数也无类型,只是一个符号代表,展开时代入指定的字符串即可,宏定义时,字符串可以是任意类型的数据。

带参宏定义说明(续) 4)调用函数只可得到一个返回值,而用宏可以设法得到几个结果。 【例9.4】 5)使用宏次数多时,宏展开后源程序长,因为每展开一次都使程序增长,而函数调用不使源程序变长。 6)宏替换不占运行时间,只占编译时间,而函数调用则占运行时间(分配单元、保留现场,值传递、返回)。 【例9.5】

C程序设计 第九章 预处理命令 例9.4 #define PI 3.1415926 #define CIRCLE(R,L,S,V) L=2*PI*R;S=PI*R*R;V=4.0/3.0*PI*R*R*R main() {float r,l,s,v; scanf("%f",&r); CIRCLE(r,l,s,v); printf("r=%6.2f,l=%6.2f,s=%6.2f,v=%6.2f\n",r,l,s,v); } 输入:3.5 输出: r=3.50,l=21.99,s=38.48,v=179.59 运行程序

例9.5 输出: 1 12 123 1234 CHINA 运行程序 #define PR printf #define NL "\n" #define D"%d" #define D1 D NL #define D2 D D NL #define D3 D D D NL #define D4 D D D D NL #define S "%s" main() {int a,b,c,d; char string[]="CHINA"; a=1;b=2;c=3;d=4; PR(D1,a); PR(D2,a,b); PR(D3,a,b,c); PR(D4,a,b,c,d); PR(S,string); } 输出: 1 12 123 1234 CHINA 运行程序

9.3 文件包含 文件包含是C预处理程序的另一个重要功能。 文件包含命令行的一般形式为: #include"文件名" 9.3 文件包含 文件包含是C预处理程序的另一个重要功能。 文件包含命令行的一般形式为: #include"文件名" 在前面我们已多次用此命令包含过库函数的头文件。例如: #include "stdio.h" #include "math.h" 【例9.6】 返回主菜单

C程序设计 第九章 预处理命令 9.4 条件编译 预处理程序提供了条件编译的功能。可以按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件。这对于程序的移植和调试是很有用的。条件编译有三种形式: 第一种形式: #ifdef 标识符 程序段1 #else 程序段2 #endif #ifdef 标识符 程序段 #endif 它的功能是,如果标识符已被 #define命令定义过则对程序段1进行编译;否则对程序段2进行编译。如果没有程序段2(它为空),本格式中的#else可以没有,即可以写为:

C程序设计 第九章 预处理命令 9.4 条件编译 第二种形式: #ifndef 标识符 程序段1 #else 程序段2 #endif 与第一种形式的区别是将“ifdef”改为“ifndef”。它的功能是,如果标识符未被#define命令定义过则对程序段1进行编译,否则对程序段2进行编译。这与第一种形式的功能正相反。

例9.6 文件 file1.c 文件 format.h #include "format.h" main() {int a,b,c,d; char string[ ]="CHINA"; a=1;b=2;c=3;d=4; PR(D1,a); PR(D2,a,b); PR(D3,a,b,c); PR(D4,a,b,c,d); PR(S,string); } #define PR printf #define NL "\n" #define D"%d" #define D1 D NL #define D2 D D NL #define D3 D D D NL #define D4 D D D D NL #define S "%s" 输出: 1 12 123 1234 CHINA 说明 运行程序

文件包含说明 1)一个include 命令只能指定一个被包含文件,如果要包含n个文件,要用n个#include命令。 2)如果文件1包含文件2,而文件2中要用到文件3内容,则可在文件1中用两个include命令分别包含文件2和文件3,而文件3应出现在文件2之前,即在file1.c中定义: #include “file3.h” #include “file2.h” 3)在一个被包含文件中又可以包含另一个被包含文件,即文件包含是可以嵌套的。

文件包含说明(续) 4)在#include命令中,文件名可以用双撇号匮尖括号括起来。如可以在file1.c中用: #include <file2.h> 或include “file2.h” 5)被包含文件(file2.h)与其所在的文件(即用#include命令的源文件file1.c)在预编译后已成为同一个文件,因此,如果file2.h中有全局静态变量,它也在file1.c文件中有效,不必用extern声明。

C程序设计 第九章 预处理命令 9.4 条件编译 它的功能是,如常量表达式的值为真(非0),则对程序段1 进行编译,否则对程序段2进行编译。因此可以使程序在不同条件下,完成不同的功能。 第三种形式: #if 常量表达式 程序段1 #else 程序段2 #endif 【例9.7】 返回主菜单

例9.7 输出: C LANGUAGE 运行程序 #define LETTER 1 main() {char str[20]="C Language",c; int i; i=0; while((c=str[i])!='\0') {i++; #if LETTER if(c>='a'&&c<='z') c=c-32; #else if(c>='A'&&c<='Z') c=c+32; #endif printf("%c",c); } 输出: C LANGUAGE 运行程序

9.5 本章小结 预处理功能是C语言特有的功能,它是在对源程序正式编译前由预处理程序完成的。程序员在程序中用预处理命令来调用这些功能。 C程序设计 第九章 预处理命令 9.5 本章小结 预处理功能是C语言特有的功能,它是在对源程序正式编译前由预处理程序完成的。程序员在程序中用预处理命令来调用这些功能。 宏定义是用一个标识符来表示一个字符串,这个字符串可以是常量、变量或表达式。在宏调用中将用该字符串代换宏名。 宏定义可以带有参数,宏调用时是以实参代换形参。而不是“值传送”。 为了避免宏代换时发生错误,宏定义中的字符串应加括号,字符串中出现的形式参数两边也应加括号。

9.5 本章小结 文件包含是预处理的一个重要功能,它可用来把多个源文件连接成一个源文件进行编译,结果将生成一个目标文件。 C程序设计 第九章 预处理命令 9.5 本章小结 文件包含是预处理的一个重要功能,它可用来把多个源文件连接成一个源文件进行编译,结果将生成一个目标文件。 条件编译允许只编译源程序中满足条件的程序段,使生成的目标程序较短,从而减少了内存的开销并提高了程序的效率。 使用预处理功能便于程序的修改、阅读、移植和调试,也便于实现模块化程序设计。 返回主菜单

The end