第9章预处理命令
C语言习题集(预处理命令篇)

第六章预处理命令6.1 选择题1.下面叙述中正确的是()。
A. 带参数的宏定义中参数是没有类型的B. 宏展开将占用程序的运行时间C. 宏定义命令是C语言中的一种特殊语句D. 使用#include命令包含的头文件必须以“.h”为后缀2.下面叙述中正确的是()。
A. 宏定义是C语句,所以要在行末加分号B. 可以使用#undef命令来终止宏定义的作用域C. 在进行宏定义时,宏定义不能层层嵌套D. 对程序中用双引号括起来的字符串内的字符,与宏名相同的要进行置换3.在“文件包含”预处理语句中,当#include后面的文件名用双引号括起时,寻找被包含文件的方式为()。
A. 直接按系统设定的标准方式搜索目录B. 先在源程序所在目录搜索,若找不到,再按系统设定的标准方式搜索C. 仅仅搜索源程序所在目录D. 仅仅搜索当前目录4.下面叙述中不正确的是()。
A. 函数调用时,先求出实参表达式,然后带入形参。
而使用带参的宏只是进行简单的字符替换B. 函数调用是在程序运行时处理的,分配临时的内存单元。
而宏展开则是在编译时进行的,在展开时也要分配内存单元,进行值传递C. 对于函数中的实参和形参都要定义类型,二者的类型要求一致,而宏不存在类型问题,宏没有类型D. 调用函数只可得到一个返回值,而用宏可以设法得到几个结果5.下面叙述中不正确的是()。
A. 使用宏的次数较多时,宏展开后源程序长度增长。
而函数调用不会使源程序变长B. 函数调用是在程序运行时处理的,分配临时的内存单元。
而宏展开则是在编译时进行的,在展开时不分配内存单元,不进行值传递C. 宏替换占用编译时间D. 函数调用占用编译时间6.下面叙述中正确的是( )。
A. 可以把define和if定义为用户标识符B. 可以把define定义为用户标识符,但不能把if定义为用户标识符C. 可以把if定义为用户标识符,但不能把define定义为用户标识符D. define和if都不能定义为用户标识符7.下面叙述中正确的是()。
第九章预处理命令(5503)

1.下面叙述中正确的是(A )。
A.带参数的宏定义中参数是没有类型的B.宏展开将占用程序的运行时间C.宏定义命令是C语言中的一种特殊语句D.使用#include命令包含的头文件必须以“.h”为后缀2.在宏定义#define PI3.14159中,用宏名代替一个( D )A.常量B.单精度数C.双精度数D.字符串3.下面有关宏替换的叙述不正确的是( D )A.宏替换不占用运行时间B.宏名无类型C.宏替换只是字符替换D.宏名必须用大写字母表示4.C语言的编译系统对宏命令的处理是( D )A.在程序运行时进行的B.和C程序中的其他语句同时进行编译的C.在程序连接时进行的D.在对源程序中其它成分正式编译之前进行的5.下列定义不正确的是(C )。
A.#define PI 3.141592B.#define S345C.int max(x,y); int x,y; { }D.static char c6.有如下宏定义 #define s(a) a*3 ,则执行表达式x=s(1+2)后,变量x的值为( D)。
A.10B.9C.8D.77.以下说法中正确的是( D)。
A.#define是C语句B.#define是库函数C.#define是自定义函数D.#define是预处理命令8.在“文件包含”预处理语句的使用形式中,当#include后面的文件用了“”(双引号)时,寻找被包含文件的方式是(B)。
A.直接按系统设定的标准方式搜索目录B.先在源程序所在目录搜索,再按系统设定的标准方式搜索C.仅仅搜索源程序所在目录D.仅仅搜索当前目录9.以下叙述正确的是( B )。
A.可以把define和if定义为用户标识符B.可以把define定义为用户标识符,但不能把if定义为用户标识符C.可以把if定义为用户标识符,但不能把define定义为用户标识符D.define和if都不能定义为用户标识符10.以下叙述中正确的是( B )。
预处理命令

二、表演区 (一)什么是表演区 表演区以幼儿表演游戏为设计核心,通过道具吸引幼儿积极参加故事表 演、游戏等活动。 (二)表演区的环境布置与材料投放 表演区可以分为固定式和活动式表演区角两类。 固定式的表演区角是指在活动室内辟出一定区域,存放表演所需要的用 具。 活动式的表演区角则是根据表演需要,临时在走廊、门厅、过道或室外 等地方设置表演场所,便于及时放置和收拢。
第9章 预处理命令
• 9. 1 概述 • 9. 2 宏定义 • 9. 3 文件包含 • 9. 4 条件编译
9. 2 宏定义
• 9. 2. 1 无参宏定义
• 无参宏的宏名后不带参数。 • 其定义的一般形式为 • #define 标识符字符串 • 其中, #表示这是一条预处理命令; 凡是以#开头的指令均为预处理命
果果:“老师,一分钟是多久呢?” 教师:“就是一会儿,我一转身。” 贝贝:“我知道,最细的秒针走一圈,挺长的。” 佳佳:“一分钟就是我们从门口走到后面的窗子那里。” 教师:“一分钟能做什么?” 佳佳:“给花浇水。” 果果:“唱完一首歌。” 贝贝:“搬来一把椅子。”……
学习目标
1. 了解幼儿日常交谈的主要特点及指导要求。 2. 掌握语言区角的环境布置与材料投放要求,能科学地开展语言区角活 动的指导。 3. 学会设计听说游戏的玩法,并能评析幼儿园听说游戏。
上一页 下一页 返回
9. 2 宏定义
• 【例9 - 2】不作宏代换程序举例。
上一页 下一页 说明: • 虽然已定义宏名OK 表示100, 但在printf 语句中OK 被引号括起来, 因
此不作宏代换。 • 程序的运行结果为“OK”, 这表示把“OK” 当字符串处理。
上一页 下一页 返回
义时, 必须十分注意, 应保证在宏代换之后不发生错误。
预处理命令

3
math.h——文件包含数学程序。 reg51.h——文件中包含51单片机的特殊寄存器定义。 reg52.h——文件中包含52单片机的特殊寄存器定义。 setjmp.h——文件包含定义jmp_buf类型和setjmp和longjmp程序原型。 stdarg.h——文件包含可变长度参数列表程序。 stdlib.h——文件包含存储区分配程序。 stdio.h——文件包含标准输入和输出程序。 string.h——文件包含字符串操作程序、缓冲区操作程序。 对于51单片机而言,源程序开头必须要包含reg51.h头文件,因为该文件对51单片 机的相关位及寄存器进行了定义,这样在程序中才可以正常使用寄存器等资源。
#else 程序段2
#endif 若常量表达式成立,则编译程序1,否则编译程序2。
5
单片机原理及应用
单片机原理及应用
C51语言中提供了各种预处理命令,其作用类似于汇编程序中的伪指令。在编译环 境对源程序进行编译前,需要先对程序中的预处理命令进行处理,然后将处理结果和源 程序一起编译。C51语言中的预处理命令包括宏定义命令、文件包含命令和条件编译命 令等。通常,除条件编译命令外,预处理命令一般放在函数体之外,并且通常都放置在 源文件的开头。
句如下:
outputs=0xff;
/*输出 1111 1111 */
进行编译时,预处理器会将整个程序中的所有outputs替换为P2。
2.文件包含命令
#include命令的功能是将指定的定义或声明文件放入程序之中,该命令常用于引入 标准库函数文件。下面是一些常用的C51头文件:
absacc.h——包含允许直接访问8051不同存储区的宏定义。 assert.h——文件定义宏,用来建立程序的测试条件。 ctype.h——包含字符转换和分类程序。 intrins.h——文件包含指示编译器产生嵌入式固有代码的程序原型。
STC单片机C语言程序设计 第9章 STC单片机C语言数据类型

16 16 32 32 32 32 1 8
2 2 4 4 4 4 1
-32768~+32767 0~65535 -2147483648~+2147483647 0~4294967295 ±1.175494E-38~±3.402823E+38 ±1.175494E-38~±3.402823E+38 0或1 0~255
对于只由 const 类型修饰符声明的变量,它可以保存在 data 、 idata或者xdata区域。
C语言中的常量和变量
--常量
如果需要将一个变量存放在 ROM中,则用code存储器类型声明。 包含 const far 的声明变量被保存在 HCONST存储器空间。典型
地,将该区域分配到ROM存储器中。
量具体的数值。
C51编译器支持的数据类型
--标准C语言所支持的类型
【例9-3】短整型整数C语言声明的例子。 short a; short int b; unsigned short c=10; signed short int d;
C51编译器支持的数据类型
--标准C语言所支持的类型
长整型
长整型整数用C语言表示为long int或long,在内存中占4个字节。
标识符为变量/常量的名字,由程序员自己命名。
C51编译器支持的数据类型
--标准C语言所支持的类型
{}内为可选项,用于进一步增强对短整型变量/常量的定义; 在声明短整型变量时,可以通过使用 “=”符号给该类型变量分配
一个具体的数值,也可以在声明短整型变量后,再给该变量分配
一个具体的数值。 对于有符号的短整型常量/变量来说,在计算机中用补码表示该变
为0x0C和0x0D的位置。
C程序设计第三版谭浩强习题答案全下

s ,另一个用来 第 9 章 预处理命令9.1 定义一个代参数的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的 实参。
输出已交换后的两个值。
解:# define SWAP(a,b) t=b;b=a;a=tmain ( ){int a,b,t;printf( “ Input two integers a,b: ” );scanf( “ %d,%d, ” *a,*b);SWAP(a,b);printf(“ Now,a=%d,b=%n ”d ,a,b);} 运行结果如下:In put two in tegers a,b : 3,4/Now,a=4,b=39.2 输入两个整数,求它们相除的余数。
用带参的宏来实现,编程序。
解:# define SURPLUS(a,b) a%bmain ( ){int a,b;printf( “Input two integers a,b:”); scanf( “ %d,%d ” ,&a,&b);printf(“Remember i s n%”d , SURPLUS(a , b));} 运行结果如下:Input two integers a,b : 60,13/Remember is 89.3 三角形的面积为: area=其中 s= (a+b+c),a,b,c 为三角形的三边。
定义两个带参的宏,一个用来求 求area 。
写程序,在程序中用带实参的宏名来求面积area 。
解:# include <math.h># define S(a,b,c)(a+b+c)/2# define AREA(a,b,c) sqrt(S(a,b,c)*(S(a,b,c)-a)*(S(a,b,c)-b)*(S(a,b,c)-c)) main ( ) {float a,b,c; printf(“Input a,b,c: ”);scanf( “ %f,%f,%f ” ,&a,&b,&c);if (a+b>c && a+c>b && b+c>a)printf(“ area:%8n.2”f. ,AREA(a,b,c));elseprintf( “ It is not a triangle! ” );}运行结果:①In put a,b,c: 3,4,5/area:6.00②In put a,b,c: 12,3,5/It is not a triangle!9.4给年份year 定义一个宏,以判断该年份是否为闰年。
C语言程序设计 第3版 第9章 编译预处理

#include "test2.c" static int sum(int n) {
int i,s=0; for(i=1;i<=n;i++)
s=s+fact(i); return s; }
static int fact(int n) {
C语言程序设计
第9章 编译预处理
第1讲:编译预处理基本形式
提纲
1.宏定义 2.文件包含 3.条件编译
1.宏定义
不带参数宏定义 带参数宏定义
格式:
#define 标识符 字符串
功能:
指定标识符代替一个较复杂的字符串。
注意说明:
(1)宏名一般习惯用大写字母,例如宏名PI。 (2)宏名用做代替一个字符串,不作语法检查。 (3)宏定义无需在末尾加“;” (4)宏定义的有效范围为#undef命令终止。 (5)在进行宏定义时,可以引用已定义的宏名。
char web[50]; int i=0; gets(web); while(web[i]!='\0') {
#if(R==1) if(web[i]>='A'&&web[i]<='Z') {web[i]=web[i]+32; i++;}
#else if(web[i]>='a'&&web[i]<='z') {web[i]=web[i]-32; i++;}
形式3:
#ifndef 标识符 程序段1
#else 程序段2
预处理指令

9.1.2 有参宏定义
1.带参宏定义的一般格式 . #define 宏名 形参表 语言符号字符串 宏名(形参表 形参表) 2.带参宏的调用和宏展开 . 实参表) (1)调用格式:宏名 实参表 )调用格式:宏名(实参表 (2)宏展开:用宏调用提供的实参字符串,直接置换 )宏展开:用宏调用提供的实参字符串, 宏定义命令行中、相应形参字符串,非形参字符保持不变。 宏定义命令行中、相应形参字符串,非形参字符保持不变。 3.说明 . (1)定义有参宏时,宏名与左圆括号之间不能留有空 )定义有参宏时, 否则, 格。否则,C编译系统将空格以后的所有字符均作为替代 字符串,而将该宏视为无参宏。 字符串,而将该宏视为无参宏。 (2)有参宏的展开,只是将实参作为字符串,简单地 )有参宏的展开,只是将实参作为字符串, 置换形参字符串,而不做任何语法检查。在定义有参宏时, 置换形参字符串, 而不做任何语法检查。在定义有参宏时, 在所有形参外和整个字符串外,均加一对圆括号。 在所有形参外和整个字符串外,均加一对圆括号。
第9章
预处理命令
ห้องสมุดไป่ตู้
所谓预处理命令是指,在对源程序进行编译之前, 所谓预处理命令是指,在对源程序进行编译之前,先 对源程序中的编译预处理命令进行处理; 对源程序中的编译预处理命令进行处理;然后再将处理的 结果,和源程序一起进行编译,以得到目标代码。 结果,和源程序一起进行编译,以得到目标代码。 9.1 宏定义 9.2 文件包含 9.3 条件编译
9.3 条件编译
条件编译可有效地提高程序的可移植性, 条件编译可有效地提高程序的可移植性,并广泛地应 用在商业软件中,为一个程序提供各种不同的版本。 用在商业软件中,为一个程序提供各种不同的版本。 1.一般格式 . #if 常量表达式 程序段1; 程序段 ; [#else # 程序段2; 程序段 ;] #endif 2.功能:当表达式为非0(“逻辑真”)时,编译程序 .功能:当表达式为非 ( 逻辑真” 段1,否则编译程序段 。 ,否则编译程序段2。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
宏定义也可以带参数,其一般形式为:
#define 宏名(参数表) 字符串 如:#define S(a,b) area=S(3,2); 定义宏名S代表矩形面积,参数a,b为边长。 宏展开过程: a*b
S(3,2)
a*b
3*2
9.2 “文件包含”处理 在一个源文件中将另一个源文件的内容包含进来。
文件包含指令的一般形式: #include 或 #include “文件名” <文件名>
宏名N等同于符号常量,可以作为数组的长度。
9.1 宏定义
例:定义一个宏名来代表一个计算公式。 #define PI 3.1415926 #define AREA PI*r*r #include <stdio.h> void main() { r=3,s; s=3.1415926*r*r; s=PI*r*r; s=AREA; printf(“\n %f”,s); } 注意:系统对宏定义的预处理是一个字符串的还原过 程。
Thanks
9.3 条件编译
例:条件编译可以提高C源程序的通用性
#ifdef COMPUTER_A #define INTEGER_SIZE 16 #else #define INTEGER_SIZE 32 #endif 如果在这组条件编译命令之前曾出现以下命令: #define COMPUTER_A 0 或 #define COMPUTER_A 只要COMPUTER_A定义过。
printf(“\n %f”,area); }
9.2 “文件包含”处理
f.c #include “f.h” #include <stdio.h> void main() { printf(“\n%f”,f1(3.0)); printf(“\n %f”,fac(10)); } float f1(float r) { return(PI*r*r); } float fac(int n) { int i; float s=1; for(i=1;i<=n;i++) s*=i; return(s); }
f.h
#define PI 3.1415926 float f1(float r); float fac(int n);
9.3 条件编译
一般情况下,源程序中所有行都参加编译,但是 有时希望程序中一部分内容只在满足一定条件时才 进行编译,也就是对一部分内容指定编译的条件, 这就是条件编译。
9.3 条件编译 条件编译命令有以下几种形式: (1) #ifdef 标识符 或 #ifdef 标识符 程序段1 程序段1 #else #endif 程序段2 #endif 作用:若指定的标识符已经被#define 命令定义过, 则在程序编译阶段编译程序段1;否则编译程序段2。 其中#else部分可以没有。
导读
C语言提供了一些以#开头的指令,如: #define #include 等。
这些指令是在编译以前就事先进行处理的,因而称 为“编译预处理”指令。
可以用编译预处理指令实现以下三种功能: (1) 宏定义 (2) 文件包含 (3) 条件编译
9.1 宏定义
1、不带参的宏定义 用一个指定的标识符(宏名)代表一个字符串。 一般形式:
#define
标识符
PI
字符串
3.1415926
如:#define
一般宏名用大写字母。
有了这一宏定义后,程序中凡是用到3.1415926的 地方都可以以宏名PI出现。
9.1 宏定义
例:定义一个宏名来代表一个参数。 #define PI 3.1415926 void main()
{
float
r=2,c,s;
例:如果文件1包含文件2,而文件2中要包含文件3的内容。 file1.c file1.c
#include “file2.c”
C A
file2.c #include “file3.c” B file3.c C
B
A
9.2 “文件包含”处理
例:如果文件1包含文件2,而文件2中要包含文件3的内容。 file1.c file1.c #include “file3.c” #include “file2.c” #include “file2.c” #include “file3.c” A C B file2.c B file3.c C A C B
练习
1、请分析以下一组宏定义的输出格式: #define NL putchar(„\n‟) #define PR(format,value) printf(“value=%formate\t”,(value)) #define PRINT1(f,x1) PR(f,x1); NL #define print2(f,x1,x2) PR(f,x1);PRINT1(f,x2) 如果在程序中有以下的宏引用: PR(d,x); PRINT1(d,x); PRINT2(d,x1,x2); 写出宏展开后的情况,并写出应输出的结果,设x=5,x1=3,x2=8。 2、定义个带参数的宏,使两个参数的值互换,并写出程序,输入两个数作 为使用宏时的实参。输出已交换后的两个值。
9.2 “文件包含”处理
例: #include <math.h>
#include <stdio.h>
void main() { float a,b,c,s,area; scanf(“%f%f%f”,&a,&b,&c); s=0.5*(a+b)*(s-b)*(s-c));
c=2*3.1415926*r; s=3.1415926*r*r;
c=2*PI*r;
s=PI*r*r;
}
系统在对程序进行编译以前,首先将所有的编译预 处理指令进行预处理,对本例来说,就是将程序中所 有的宏名PI还原成3.1415926,——宏展开。
9.1 宏定义
例:定义一个宏名来代表一个数据个数。
9.3 条件编译
例:输入一行字母字符,根据需要设置条件编译,使之能将 字母全改为大写输出,或全改为小写字母输出。
#include <stdio.h> 1 #define LETTER 0 void main() { char str[20]=“C Language”,c; int 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); } }
#define N 50 100 方便修改参数 #include <stdio.h> void main() { int a[N],i; float s=0; for(i=0;i<N;i++) scanf(“%d”,&a[i]); for(i=0;i<N;i++) s+=a[i]; s/=N; printf(“\n %f”,s); }
第九章 预处理命令
主要内容
9.1 宏定义
9.2 “文件包含”处理
9.3 条件编译
导读
C程序上机步骤:
编辑
程序代码的录入,生成源程序 *.cpp(VC++)或*.c(TC)。 语法分析查错,翻译生成目标 程序*.obj 。 与其它目标程序或库链接,生 成可执行程序*.exe 。
编译
链接
执行
运行程序,得到程序结果。
9.1 宏定义
注意以下程序的运行结果:
#define
F
(x+y) x+y
#include <stdio.h> void main() { int x=3,y=5,z; z=z*x+y; z=z*(x+y); z=2* F ); ( printf(“\n %d”,z); }
9.1 宏定义
2、带参的宏定义
用< >时,系统在存放C库函数头文件的目录中寻找 要包含的文件,这称为标准方式。 用“ ”时,系统在用户当前目录中寻找要包含的文 件,如果找不到,在按标准方式查找。
9.2 “文件包含”处理 file1.c
#include “file2.c”
file1.c
B A
file2.c
A
B
9.2 “文件包含”处理
作用:若指定的标识符未被#define 命令定义过,则 在程序编译阶段编译程序段1;否则编译程序段2。其 中#else部分可以没有。
9.3 条件编译 (3) #if 表达式 程序段1 #else 程序段2 #endif 作用:若指定的表达式为真(非0)时,则在程序编 译阶段编译程序段1;否则编译程序段2。
9.3 条件编译 例:在调试程序时,希望输出一些信息,而调试 完后不在输出这些信息。 #ifdef DEBUG printf(“x=%d,y=%d”,x,y); #endif 如果在这组条件编译命令之前出现以下命令: #define DEBUG
9.3 条件编译 (2) #ifndef 标识符 程序段1 #else 程序段2 #endif