第9章预处理命令

合集下载

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

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)

第九章预处理命令(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语言数据类型

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程序设计第三版谭浩强习题答案全下

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章 编译预处理

C语言程序设计 第3版 第9章 编译预处理
int s; s=sum(5); printf("s%d\n",s); }
#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。

C语言程序设计第五版谭浩强 ppt课件

C语言程序设计第五版谭浩强 ppt课件

第一章 C语言概述
C语言结构特点
❖函数与主函数
程序由一个或多个函数组成
必须有且只能有一个主函数main(),可以放在程序中任一 位置
程序执行从main开始,在main中结束,其它函数通过嵌 套调用得以执行。
❖程序语句
C程序由语句组成 用“;”作为语句终止符
❖注释
/* */为注释,不能嵌套
教材、参考书与课时安排
教材
C程序设计 (第二版) 谭浩强编著 清华大学出版社
参考书
C语言程序设计教程 谭浩强 高等教育出版社 C高级实用程序设计 王士元 清华大学出版社 C程序设计试题汇编 谭浩强 清华大学出版社
课时安排
64学时
课程目的
§熟记C语言的基本概念 §熟悉Turbo C的上机操作环境 §会读、会编、会调试C程序
<>
C语言程序设计
第一章 C语言概述
C语言发展过程
❖产生背景
ALGOL 60→CPL语言→BCPL→B语言,写UNIX系统
❖产生过程
时间:1972~1973 地点:美国贝尔实验室 目的:UNIX操作系统 设计人: Ken.Thompson和Dennis.M.Ritchie
❖C标准
标准C: 1978年 K&R合著《The C Programming Language》
}
通过max函数将z值带回调用处
<>
C语言程序设计
第一章 C语言概述
C语言格式特点
❖习惯用小写字母,大小写敏感
❖不使用行号,无程序行概念 ❖可使用空行和空格 ❖常用锯齿形书写格式
mmaiani(n() ) {{ ……………….
int…i…, j…, …sum…;… sum=0…; ………..

第九章改 预处理命令习题答案

第九章改 预处理命令习题答案

第九章习题答案一、单项选择题1.A2.B3.C4.D5.B6.C7.A8.D9.D10.C11.B12.C13.D14.C二、填充题1.编译处理编译预处理2.非静态存储类型变量和外部函数3.74.printf(“%d\n”,m);5.fopen(“a.txt”,”rw”);6.x[i]>=’A’&&x[i]<=’Z’7.“ i=%d\n”8.(1) #define MAX(a,b,c)(2) #define MIN(a,b) (a<b?a:b)(3) #define isalnum(c) (c>=’0’&& c<=’9’)(4) #define isupper( c) (c>=’A’&& c<=’Z’)(5) #define islower( c) (c>=’a’ && c<=’z’)三、程序分析题1.运行结果: -32.运行结果: 7,473.运行结果:50 254.运行结果:x=9, y=55.运行结果:9 9 116.输出结果: x|y&z=3x^y&~z=1x&y&z=0!x|x=1~x|x=-1四、程序设计题1.解:#include <stdio.h>#include <math.h>#define S(a, b, c) 0.5* (a+b+c)#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)) void main ( ){ float a, b, c;printf (“输入三角形的三条边长:a, b, c\n”);scanf (“%f, %f, %f”, &a, &b, &c) ;if (( a+b>c)&& (b+c>a) && (c+a>b)){ printf (“周长=%f\n”, 2*S(a, b, c ));printf (“面积=%f\n”, AREA(a, b, c ));}else printf (“a, b, c 的长度不能构成三角形\n”) ;}2.解:#include <stdio.h>#include <stdlib.h>void main (int argc, char *argv[ ]){ int a, b;if (argc<3) { printf (“Parameter missing!\n”) ; exit(0); }a=atoi (argv[1]) ;b=atoi (argv[2]) ; //在stdlib.h中有库函数atoi, 把字符串转换成整数printf (“%5d + %5d = %5d\n”, a, b, a+b) ;printf (“%5d - %5d = %5d\n”, a, b, a-b) ;printf (“%5d * %5d = %5d\n”, a, b, a*b) ;printf (“%5d / %5d = %5d\n”, a, b, a/b) ;printf (“%5d %% %5d = %5d\n”, a, b, a%b) ;}3.解:#include <stdio.h>#include <stdlib.h>void main (int argc, char *argv[]){ int i, sum=0;for (i=1; i<argc; i++) sum=sum+atoi (argv[i]) ;printf (“和= %d\n”, sum);}4.解:#include <stdio.h>#include <stdlib.h>#include <string.h>void main (int argc, char *argv[]){ if (argc<3){ printf (“Parameter missing!\n”) ; exit(0); } if ( strcmp (argv[1], argv[2])>0) puts (argv[1]) ;else puts (argv[2]) ;}。

第9章预处理定义

第9章预处理定义
⑷宏定义不是C语句#d,ef不ine必a在rra行y_末siz加e 2分00号0,如果加了分号则 连分号一起进行置在换该。场合下array_size所代表的是2000, ⑸#define命令出现在使程用序宏函定数义的,外可面以,提宏高名程的序有的效通范用围性为。定 义命令之后到本源文件结束。
C语言程序设计(第三版) My email:chenguot@
area=S(a); printf(“r=%f\narea=%f\n”,a,area);
area=3.1415926*a*a;
}
C语言程序设计(第三版) My email:chenguot@
10
§9.1 宏定义(7)
如下宏定义:
说明:
#define S (r) PI*r*r
⑴对带参数的宏的展开只是将语对句于中语的句宏名后面括号内的实
file1.c 或
file2.c
#include<file2.c>
#include <文件名> B
A
file1.c
A B
C语言程序设计(第三版) My email:chenguot@
16
§将包9.宏含2代到表用“文输户出程件格序包式中做:含出”头文处件理,并(2) (2)主文件file1.c
(好1处):将“格文式件宏包做含成”头命文令件可fo以rm节at.省h 程序设计void人m员ain的() 重复劳动。
#如inc:lud某e <单std位io.的h>人员往往使用一组固定的符号{ 常量(g=9.81,
#pdie=fi3n.e1P4R15p9ri2nt6f,e=2.718,c=…),可以把这些宏int定a,b义,c,d命; 令组成 ##一量定ddeeff个包义iinnee头含这ND文到些L“%“件自符\dn””,己号然所常后写量各的,人源相都文当可件于以中工用。业这上#in样的cl每标ud个准e命人零令cah=就件a1将r;b可,s=t这r2i以拿n;cg些=[不来]3=;符d“必就C=4号H;重用IN常A复。”;

1、预处理——精选推荐

1、预处理——精选推荐

1、预处理1、预处理命令的定义 使⽤库函数之前,应该⽤#include引⼊对应的头⽂件。

这种以#号开头的命令称为预处理命令。

所谓预处理是指在进⾏编译时的第⼀遍扫描(词法扫描和语法分析)之前所做的⼯作。

预处理是C语⾔的⼀个重要功能,它由于处理程序负责完成。

当编译⼀个程序时,系统将⾃动调⽤预处理程序对程序中“#”开头的预处理部分进⾏处理,处理完毕之后可以进⼊源程序的编译阶段。

C语⾔源⽂件要经过编译、链接才能⽣成可执⾏程序: (1)编译(Compile)会将源⽂件(.c⽂件)转换为⽬标⽂件。

对于 VC/VS,⽬标⽂件后缀为.obj;对于GCC,⽬标⽂件后缀为.o。

编译是针对单个源⽂件的,⼀次编译操作只能编译⼀个源⽂件,如果程序中有多个源⽂件,就需要多次编译操作。

(2)链接(Link)是针对多个⽂件的,它会将编译⽣成的多个⽬标⽂件以及系统中的库、组件等合并成⼀个可执⾏程序。

在实际开发中,有时候在编译之前还需要对源⽂件进⾏简单的处理。

例如,我们希望⾃⼰的程序在 Windows 和 Linux 下都能够运⾏,那么就要在 Windows 下使⽤ VS 编译⼀遍,然后在 Linux 下使⽤ GCC 编译⼀遍。

但是现在有个问题,程序中要实现的某个功能在 VS 和GCC 下使⽤的函数不同(假设 VS 下使⽤ a(),GCC 下使⽤ b()),VS 下的函数在 GCC 下不能编译通过,GCC 下的函数在 VS 下也不能编译通过,怎么办呢? 这就需要在编译之前先对源⽂件进⾏处理:如果检测到是 VS,就保留 a() 删除 b();如果检测到是 GCC,就保留 b() 删除 a()。

这些在编译之前对源⽂件进⾏简单加⼯的过程,就称为预处理(即预先处理、提前处理)。

预处理主要是处理以#开头的命令,例如#include <stdio.h>等。

预处理命令要放在所有函数之外,⽽且⼀般都放在源⽂件的前⾯。

预处理是C语⾔的⼀个重要功能,由预处理程序完成。

第九章 预处理命令

第九章 预处理命令

第九章 预处理命令一、选择题1.以下叙述不正确的是 。

A)预处理命令行都必须以#开始B)在程序中凡是以#开始的语句行都是预处理命令行C)C程序在执行过程中对预处理命令行进行处理D)预处理命令行可以出现在C程序中任意一行上2.以下叙述中正确的是 。

A)在程序的一行上可以出现多个有效的预处理命令行B)使用带参数的宏时,参数的类型应与宏定义时的一致C)宏替换不占用运行时间,只占用编译时间D)C语言的编译预处理就是对源程序进行初步的语法检查3.以下有关宏替换的叙述不正确的是 。

A)宏替换不占用运行时间B)宏名无类型C)宏替换只是字符替换D)宏名必须用大写字母表示4.在“文件包含”预处理命令形式中,当#include后面的文件名用””(双引号)括起时,寻找被包含文件的方式是 。

A)直接按系统设定的标准方式搜索目录B)先在源程序所在目录中搜索,再按系统设定的标准方式搜索C)仅仅搜索源程序所在目录D)仅仅搜索当前目录5.在“文件包含”预处理命令形式中,当#include后名的文件名用<>(尖括号)括起时,寻找被包含文件的方式是 。

A)直接按系统设定的标准方式搜索目录B)先在源程序所在目录中搜索,再按系统设定的标准方式搜索C)仅仅搜索源程序所在目录D)仅仅搜索当前目录6.在宏定义#define PI 3.1415926中,用宏名PI代替一个 。

A)单精度数B)双精度数C)常量D)字符串7.以下程序的运行结果是 。

#include<stdio.h>#define ADD(x) x+xvoid main ( ){ int m=1,n=2,k=3,sum ;sum = ADD(m+n)*k ;printf(“%d\n”,sum) ;A)9 B)10 C)12 D)188.以下程序的运行结果是 。

#include<stdio.h>#define MIN(x,y) (x)>(y) ? (x) : (y)void main ( ){ int i=10, j=15 , k;k = 10*MIN(i,j);printf(“%d\n”,k);}A)10 B)15 C)100 D)1509.以下程序的运行结果是 。

Tc_12_tt_编译预处理

Tc_12_tt_编译预处理
各程序文件模块分别编译, 各程序文件模块分别编译,再连接
– 整个程序只允许有一个 整个程序只允许有一个main()函数 函数 当一个C 当一个C语言程序由多个文件模块组成时 整个程序只允许有一个main()函数. 函数. ,整个程序只允许有一个 函数 为了能调用写在其它文件模块中的函数, 为了能调用写在其它文件模块中的函数, 文件包含是一个有效的解决方法. 文件包含是一个有效的解决方法.
常用标准头文件
ctype.h 字符处理 math.h 与数学处理函数有关的说明与定义 stdio.h 输入输出函数中使用的有关说明和定义 string.h 字符串函数的有关说明和定义 stddef.h 定义某些常用内容 stdlib.h 杂项说明 time.h 支持系统时间函数
9.2 宏定义
area=S(3,2) ( , )
得 3*2
例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); }
说 明
1. 注意宏定义时形参加括号的重要性.如对上例中的 注意宏定义时形参加括号的重要性. 宏定义,有下列语句: );,则宏展开为 宏定义,有下列语句:area=S(a+b);,则宏展开为: ( );,则宏展开为: area=PI*a+b*a+b;显然与程序设计者的意图不符. ;显然与程序设计者的意图不符. 正确的宏定义为: 正确的宏定义为: # define S(r) PI*(r)*(r) ( ) ( ) ( ) 2. 宏名与带参数的括号之间不能加空格. 宏名与带参数的括号之间不能加空格.

C语言初级学习——预处理命令

C语言初级学习——预处理命令

9.4 预定义宏
• 预定义宏是C编译器预先定义好的宏,不是 用户定义的,因而不能出现在#define与# undef语句中。 • 如: _ _FILE_ _ _ _DATE_ _ 等一些常见预定义宏标识符。
【例】预定义宏使用举例。
main() { printf("%s\n",__FILE__); printf("%s\n",__DATE__); printf("%s\n",__TIME__); }
结果显示: c:\data\a.c May 22 2001 21:02:54
9.5 运算符#和##
在带参数的宏替换中,若形参中含有#: • #:
“字符串” • 例如: #字符串 #define display(i) printf(#i) ……;display(This is a test);…… 则替换为:printf(“This is a test”);
若有宏定义:#define MOD(x,y) x%y
则执行以下语句后的输出为____
int z, a=15, b=100; z=MOD(b,a); printf(“%d\n”,z++); A 11 C 6 B 10 D 宏定义不合法
若有宏定义如下: #define x 5 #define Y X+1 #define Z Y*X/2 那么执行以下printf语句后,输出结果是____. int a; a=Y; printf(“%d\n”,Z); printf(“%d\n”,--a); A 7 B 12 C 12 D 7 6 6 5 5
#include “文件名称” #include <文件名称>
• 在一些版本的C语言中,还允许“文件名”中 带路径。

第9章 预处理

第9章 预处理

C语言试题库(第9章)一、选择题1、宏定义#define PI 31.14159中,宏名PI代替______________。

A、浮点型B、整型C、常量D、字符串答案A 难度12、设有以下宏定义:#define N 3#define Y(n) ((N+1)*n)执行语句z=2*(N+Y(5+1));后,z的值为_____________。

A、出错B、42C、48D、54答案C 33、以下说法正确的是_____________。

A、#define和printf都是C语句B、#define 是C语句,而printf不是C、printf是C语句,但#define不是D、#define 和printf都不是C语句答案D 难度24、宏定义的宏展开是在__________阶段完成的。

A、第一遍编译B、第二遍编译C、程序执行D、预编译答案D 难度 15、编译预处理命令以___________结尾。

A、;B、.C、\D、回车答案D 难度16、以下叙述中正确的是________.a)在程序的一行上可以出现多个有效的预处理命令行b)使用带参的宏时,参数的类型应与宏定义时的一致c)宏替换不占用运行时间,只占用编译时间d)在以下定义中C R是称为“宏名”的标识符#define C R 045答案C 难度37、以下程序的运行结果是________.#define MIN(x,y) (x)<(y)?(x):(y)main(){int i=10,j=15,k;k=10*MIN(i,j);printf("%d\n",k);}a)10 b)15 c)100 d)150答案B 难度 48、若有宏定义如下:#define X 5#define Y X+1#define Z Y*X/2则执行以下printf语句后,输出结果是_______.int a;a=Y;printf("%d\n",Z);printf("%d\n",a);a)7 b)12 c)12 d)76 6 5 5答案 A 难度 29、请读程序:#include <stdio.h></P< p>#define MUL(x,y) (x)*ymain(){int a=3,b=4,c;c=MUL(a++,b++);printf("%d\n",c);}上面程序的输出结果是__________.a)12 b)15 c)20 d) 16答案A 难度410、对下面程序段:#define A 3#define B(a) ((A+1)*a)...x=3*(A+B(7));正确的判断是_________.a)程序错误,不许嵌套宏定义b)x=93c)x=21d)程序错误,宏定义不许有参数答案 B 难度311、以下正确的描述是____________.a)C语言的预处理功能是指完成宏替换和包含文件的调用b)预处理指令只能位于C源程序文件的首部c)凡是C源程序中行首以"#"标识的控制行都是预处理指令d)C语言的编译预处理就是对源程序进行初步的语法检查答案C 难度212、在"文件包含"预处理语句的使用形式中,当#include后面的文件名用< >(尖括号)括起时,找寻被包含文件的方式是_______.a)仅仅搜索当前目录b)仅仅搜索源程序所在目录c)直接按系统设定的标准方式搜索目录d)先在源程序所在目录搜索,再按照系统设定的标准方式搜索(双撇号的)答案 C 难度313、有以下程序#define F(X,Y)(X)*(Y)main(){ int a=3, b=4;printf("%d\n", F(a++, b++));}程序运行后的输出结果是()A)12 B)15 C)16 D)20 正确答案: A 难度414、以下叙述中不正确的是()A)预处理命令行都必须以#号开始B)在程序中凡是以#号开始的语句行都是预处理命令行C)宏替换不占用运行时间,只占编译时间D)在以下定义是正确的:#define PI 3.1415926;正确答案: D 难度 215、有如下程序:#define N 2#define M N+1#define NUM 2*M+1main(){ int i;for(i=1;i<=NUM;i++)printf("%d\n",i);}该程序中的for循环执行的次数是( )A)5 B)6 C)7 D)8 正确答案: B 难度416、以下程序的运行结果是( )#define MIN(x,y)(x)<(y)?(x):(y)main(){ int i=10,j=15,k;k=10*MIN(i,j);printf("%d\n",k);}A)10 B)15 C)100 D)150正确答案: B 难度 117、有如下定义#define D 2int x=5;float y=3.83;char c=′D′;则下面选项中错误的是 ( )A)x++; B)y++; C)c++; D)D++;正确答案: D 难度 418、以下程序段的执行结果为 ( )#define PLUS(X,Y)X+Ymain(){ int x=1,y=2,z=3,sum;sum=PLUS(x+y,z)*PLUS(y,z);printf("SUM=%d",sum);}A)SUM=9 B)SUM=12 C)SUM=18 D)SUM=28 正确答案: B 难度 319、下列程序的输出结果是 ( )#include "stdio.h"#defineM(x,y)x%ymain(){ int a,m=12,n=100;a=M(n,m);printf("%d\n",a--);}A)2 B)3 C)4 D)5 正确答案: C 难度420 、阅读下列程序段,则程序的输出结果为 ( )#include "stdio.h"#define M(X,Y)(X)*(Y)#define N(X,Y)(X)/(Y)main(){ int a=5,b=6,c=8,k;k=N(M(a,b),c);printf("%d\n",k);}A)3 B)5 C)6 D)8 正确答案: A 难度221、已知#define M 2;的宏定义,执行语句k=M*5;后,k的值是 ( )A)10 B)5 C)2 D)以上答案都不对正确答案: D 难度122、以下关于宏替换叙述中,错误的是 ( )A)宏替换占用编译时间 B)替换文本中可以包含已定义过的宏名C)宏名可以由+号组成 D)宏替换只能是字符替换正确答案: D 难度 223、以下程序的运行结果是________.#define MIN(x,y) (x)<(y)?(x):(y)main(){int i=10,j=15,k;k=10*MIN(i,j);printf("%d\n",k);}a)10 b)15 c)100 d)150答案B 难度 224、若已定义的函数有返回值,则以下关于该函数调用的叙述中错误的是()A)函数调用可以作为独立的语句存在B)函数调用可以作为一个函数的实参C)函数调用可以出现在表达式中D)函数调用可以作为一个函数的形参正确答案: D 难度125、以下正确的说法是()A)定义函数时,形参的类型说明可以放在函数体内B)return后边的值不能为表达式C)如果函数值的类型与返回值类型不一致,以函数值类型为准D)如果形参与实参类型不一致,以实参类型为准正确答案: C 难度226、以下正确的说法是()A)用户若需调用标准库函数,调用前必须重新定义B)用户可以重新定义标准库函数,若如此,该函数将失去原有含义C)系统根本不允许用户重新定义标准库函数D)用户若需调用标准库函数,调用前不必使用预编译命令将该函数所在文件包括到用户源文件中,系统自动调用正确答案: B 难度127、以下叙述正确的是()A)函数可以嵌套定义但不能嵌套调用B)函数既可以嵌套调用也可以嵌套定义C)函数既不可以嵌套定义也不可以嵌套调用D)函数可以嵌套调用但不可以嵌套定义正确答案: D 难度128、以下程序有语法错误,有关错误原因的正确说法是()main(){ int G=5,k;void prt_char();...k=prt_char(G);...}A)语句 void prt_char();有错,它是函数调用语句,不能用void说明B)变量名不能使用大写字母C)函数说明和函数调用语句之间有矛盾D)函数名不能使用下划线正确答案: C 难度 329、以下正确的函数头定义形式是()A)double fun(int x,int y)B)double fun(int x;int y)C)double fun(int x,int y);D)double fun(int x,y);正确答案: A 难度230、以下所列的各函数首部中,正确的是()A)void play(var :Integer,var b:Integer)B)void play(int a,b)C)void play(int a,int b)D)Sub play(a as integer,b as integer)正确答案: C 难度131 下面函数调用语句含有实参的个数为()func((exp1,exp2),(exp3,exp4,exp5));A)1B)2C)4D)5正确答案: B 难度432、有以下程序float fun(int x,int y){ return(x+y);}main(){ int a=2,b=5,c=8;printf("%3.0f\n",fun((int)fun(a+c,b),a-c));}程序运行后的输出结果是()A)编译出错B)9C)21D)9.0正确答案: B 难度233、下列程序执行后的输出结果是()void func1(int i);void func2(int i);char st[]="hello,friend!";void func1(int i){ printf("%c",st[i]);if(i<3) { i+=2;func2(i);}}void func2(int i){ printf("%c",st[i]);if(i<3) { i+=2;func1(i);}}main(){ int i=0; func1(i); printf("\n");}A)helloB)helC)hloD)hlm考生答案: 正确答案: C34、下列函数的运行结果是()main(){ int i=2,p;int j,k;j=i;k=++i;p=f(j,k);printf("%d",p);}int f(int a,int b){ int c;if(a>b) c=1;else if(a==b) c=0;else c=-1;return(c);}A)-1B)1C)2D)编译出错,无法运行正确答案: A 难度335、有以下函数 char * fun(char *p) { return p; } 该函数的返回值是()A、无确切的值B、形参p中存放的地址值C、一个临时存储单元的地址D、形参p自身的地址值正确答案:B 难度 136、下面程序应能对两个整型变量的值进行交换。

C语言程序设计 16-枚举、预处理等汇总

C语言程序设计  16-枚举、预处理等汇总
带参的宏定义在分析程序之前先进行宏展开, S(a+b,c+d)展开时用a+b代替x,用c+d代替y, 展开的结果为:a+b*c+d
24
带参的宏定义使用举例
#define S(x,y) x*y main() { int a=3,b=4,c=5,d=6;
printf("a*b=%d\n", S (aa*b, b ) ) ; printf("a+b*c+d=%d\n" , S(a((+ab+)b*()c,(+cd+)d))));; }
enum weekday day; (2) enum weekday {Sun,Mon,Tue} day; (3) enum {Sun,Mon,Tue} day;
12
三、枚举型变量的使用
1)可对枚举变量赋值,但只能把枚举元素名赋给 枚举变量,不能把枚举元素值直接赋给枚举变量。 如: enum weekday {Sun,Mon, Tue, Wed, Thu,
10
一、枚举类型的定义
• 枚举元素的值也可在定义时重指定。例如: enum weekday {Sun=7,Mon=1, Tue, Wed, Thu,
Fri, Sat} ; 对于没有指定值的元素,按顺序加1,故: Tue是2,Wed是3,…,Sat是6。
11
二、枚举型变量的定义 枚举型变量的定义也有三种方式,如: (1) enum weekday { Sun,Mon,Tue };
3)可用枚举变量进行判断或比较操作。 enum flag {true,false} my_flag; … if (my_flag == true)

二级c语言第九章预处理命令

二级c语言第九章预处理命令

如果在程序中有下面的语句: R1=Radium(100); 那么,在编译预处理时,宏展开的顺序为从左到右进行置换,如果字符串 中包含宏中的形参,则将其用程序语句中相应的实参来替代,而字符串中的 其它字符原样保留。 因此,在处理上述语句时,将用 sqrt(area/PI) 替代 Radium(100),同时将 字符串sqrt(area/PI)中的形参area用实参l00来替代,并把已定义的宏PI的值代 入,经宏展开后,该语句变为“ R1=sqrt(100/3.14159); ”。
内蒙古科技大学 工程训练中心
预处理命令概述
所谓预处理,就是指源程序被正式编译之前所进行的处理工作,这 是C语言和其他高级语言之间的一个重要区别。
所有的预处理指令均以“#”开头,在它前面不能出现空格以外的字 符,而且在行结尾处没有分号。 “预处理命令” 的作用不是实现程序的功能,它们是发布给编译系 统的信息。它们告诉编译系统,在对源程序进行编译之前应该做些什么, 所以称这类语句为编译预处理命令。 C语言在执行一个C程序时,如果程序中有预处理命令,则首先进行 编译预处理(即根据预处理命令对源程序进行预先处理),然后再将经过 预处理的源程序编译成目标文件,而后进行目标文件的连接,当这些工 作都顺利通过后,才最终执行目标代码。这种执行过程大大提高了编程 效率。
PI 的有效范围
因为#undef 的作用是终止宏定义,因此PI的作用域从它定义开始到 #undef结束。在这以后,如果程序中出现 PI,则它不代表3.14159 。使 用#undef可以灵活控制宏定义的作用范围。
2019年1月8日5时29分 工程训练中心 徐国海
(二)带参数宏定义 (了解) 定义的一般格式为: #define 宏名(形式参数列表) 字符串

C语言9

C语言9

第 九 章 编 译 预 处 理
7-1
宏定义 不带参数的宏定义 带参数的宏定义
7-1-1 7-1-2
7-2
7-3
文件包含
条件编译
9-1
宏定义
例9-1 请看下面的程序: #define PI 3.14159 main() {float r,l,s; scanf("%f",&r); l=2*PI*r; s=PI*r*r; printf("l=%7.2f,s=%7.2f\n",l,s); } 程序的第一行内容:#define PI 3.14159 就是一个宏定义,PI 称为宏名,其作用是用标识符PI代表3.14159这样一串字符。在此之后 的程序中就可以用标识符PI代替3.14159,称为宏引用。 预处理时,程序中的PI 将被所定义的串3.14159替换,称为宏展开 或宏替换,如程序中的语句:l=2*PI*r;和s=PI*r*r;中的宏展开后分别 为:l=2*3.14159*r;和s=3.14159*r*r;。 有两种形式的宏 :不带参数的宏和带参数的宏。
9-2
文件包含(1)
一个C 程序由若干个源程序组成,而一个源文件还可以将另一个源 文件的全部内容包含进来,即将指定源文件的内容包含在当前文件中。 例如有两个源文件file1.c和file2.c,文件的内容分别如下: file1.c的内容: int max(int x,int y) {int z; if(x>y) z=x; else z=y; return z; } file2.c的内容: #include "file1.c" main() {int a,b,c; scan("%d,%d",&a,&b); c=max(a,b); printf("c=%d\n",c); }
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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
相关文档
最新文档