c语言习题集合预处理命令
C语言习题集(预处理命令篇)
![C语言习题集(预处理命令篇)](https://img.taocdn.com/s3/m/00d688db50e2524de5187ecc.png)
第六章预处理命令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.下面叙述中正确的是()。
C语言 第九章 预处理命令
![C语言 第九章 预处理命令](https://img.taocdn.com/s3/m/138bbf2eed630b1c59eeb561.png)
目的: 简化程序的编写 ; 提高程序的模块化、可读性、可移植性。
有三种类型的预处理命令: 1. 宏定义命令; 2. 文件包含命令; 3. 条件编译命令。
为了与C语句区别,这些命令均以“ # ”开头。
处理流程: 第一次编译扫描时,将预编译命令处理完, 然后再进行正式编译,生成目标代码。
#define f(a)
(a)* b
若有:f(x+y) 则应有:
(x+y)b
若有:f(x+y+z) 则应有:
预编译后, z = f(x+y) 变成: z = x+y*b 结果为: z=31
(x+y+z)b
(这个结果与初始设想不一致)
“带参数宏定义” 必须注意以下几个方面: 1. 宏定义时要考虑实参(替换)的各种可能, 防止出 现二义性。
3. #include后的文件名既可用“ ”,也可用< >, 二者区别:
“ ”首先在当前目录中找,然后再去标准目录中找。
< > 只在标准目录(include目录)中找。
为提高预处理的搜索效率,通常对自定义的 非标准头文件使用方式一;而对系统提供的标准 头文件(如:math.h、stdio.h等)使用方式二。
将返回值 6 将返回值 8
但二者还是有区别的:
1) 宏替换在预编译时进行;
而函数调用在程序运行时进行
2) 宏展开时,仅仅是将宏体中的形参简单 地置换为实参,不计算实参值,也不会带来任何 返回值; 而函数调用要进行: l 计算实参值(假定用 2+3、 9–1作为实参将 被计算出来)、 l参数传递(将 5、8 传给形参x、y)、
这些文件要用到公用信息时,只要在文件 中加入#include “f.h”这么一行命令既可。这样 就不必在f1.c、…… 、fn.c每个文件中都去重 复定义这些公用的信息。
c语言预处理命令之条件编译(ifdefelseendifif等)
![c语言预处理命令之条件编译(ifdefelseendifif等)](https://img.taocdn.com/s3/m/523fc3b8a45177232f60a2e3.png)
C语言预处理命令之条件编译(#ifdef,#else,#endif,#if等)预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。
可见预处理过程先于编译器对源代码进行处理。
在C语言中,并没有任何内在的机制来完成如下一些功能:在编译时包含其他源文件、定义宏、根据条件决定编译时是否包含某些代码。
要完成这些工作,就需要使用预处理程序。
尽管在目前绝大多数编译器都包含了预处理程序,但通常认为它们是独立于编译器的。
预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行响应的转换。
预处理过程还会删除程序中的注释和多余的空白字符。
预处理指令是以#号开头的代码行。
#号必须是该行除了任何空白字符外的第一个字符。
#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。
整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。
下面是部分预处理指令:指令用途#空指令,无任何效果#include包含一个源代码文件#define定义宏#undef取消已定义的宏#if如果给定条件为真,则编译下面代码#ifdef如果宏已经定义,则编译下面代码#ifndef如果宏没有定义,则编译下面代码#elif如果前面的#if给定条件不为真,当前条件为真,则编译下面代码#endif结束一个#if……#else条件编译块#error停止编译并显示错误信息一、文件包含#include预处理指令的作用是在指令处展开被包含的文件。
包含可以是多重的,也就是说一个被包含的文件中还可以包含其他文件。
标准C编译器至少支持八重嵌套包含。
预处理过程不检查在转换单元中是否已经包含了某个文件并阻止对它的多次包含。
这样就可以在多次包含同一个头文件时,通过给定编译时的条件来达到不同的效果。
例如:#defineAAA#include"t.c"#undefAAA#include"t.c"为了避免那些只能包含一次的头文件被多次包含,可以在头文件中用编译时条件来进行控制。
C语言中的三种预处理功能
![C语言中的三种预处理功能](https://img.taocdn.com/s3/m/be7a5c10854769eae009581b6bd97f192279bf97.png)
C语言中的三种预处理功能C语言中的三种预处理功能导语:预处理指令是以#号开头的代码行。
#号必须是该行除了任何空白字符外的第一个字符。
#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。
整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。
下面是C语言三种预处理功能,欢迎阅读:指令用途# 空指令,无任何效果#include 包含一个源代码文件#define 定义宏#undef 取消已定义的宏#if 如果给定条件为真,则编译下面代码#ifdef 如果宏已经定义,则编译下面代码#ifndef 如果宏没有定义,则编译下面代码#elif 如果前#if条件不为真,当前条件为真,则编译下面代码,其实就是else if的简写#endif 结束一个#if……#else条件编译块#error 停止编译并显示错误信息特殊符号预编译程序可以识别一些特殊的符号。
预编译程序对于在源程序中出现的这些串将用合适的值进行替换。
注意,是双下划线,而不是单下划线。
FILE 包含当前程序文件名的字符串LINE 表示当前行号的整数DATE 包含当前日期的字符串STDC 如果编译器遵循ANSI C标准,它就是个非零值TIME 包含当前时间的字符串//例#includeint main(){printf("Hello World! ");printf("%s ",__FILE__);printf("%d ",__LINE__);return 0;}1. 宏定义不带参数宏定义又称为宏代换、宏替换,简称“宏”。
预处理(预编译)工作也叫做宏展开:将宏名替换为字符串,即在对相关命令或语句的含义和功能作具体分析之前就要换。
格式:#define 标识符字符串其中标识符就是所谓的符号常量,也称为“宏名”。
例:#define Pi 3.1415926//把程序中出现的Pi全部换成3.1415926 说明:(1)宏名一般用大写;(2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。
C语言程序设计教程CJ_04预处理命令_潭浩强第3版
![C语言程序设计教程CJ_04预处理命令_潭浩强第3版](https://img.taocdn.com/s3/m/419a9e4a852458fb770b5657.png)
Page 6
辽宁师范大学
蔡静
带参宏替换 函数调用 编译时替换, 运行时调用, 编译时替换 不占用内存 运行时调用 占用内存 只替换不计算 计算 替换使程序代码加长 不加长 存在数据类型问题 不存在数据类型问题
Page 7
辽宁师范大学
蔡静
9.2 “文件包含 处理 文件包含”处理 文件包含
通过预处理命令#include把另一个文件的全部内容包含到本 文件中。 格式1: #include <文件名 文件名> 文件名 只按系统指定的标准方式(从编译系统所在子目录中)检索 文件目录。 格式 2: #include “文件名” 文件名” 文件名 系统首先在当前源文件所在目录中寻找该文件,若找不到, 再按系统指定的标准方式检索其他文件目录。 例:9.6
Page 9
辽宁师范大学
蔡静
Thanks
Page 8
辽宁师范大学
蔡静
9.3 条件编译
指定满足某条件才能对指定语句进行编译,称为条件编译。 几种形式: 程序段2】 程序段 】 #endif
#ifndef 标识符 程序段1 程序段 【#else 程序段2】 程序段 】 #endif
#if 表达式 程序段1 程序段 【#else 程序段2】 程序段 】 #endif
Page 5
辽宁师范大学
蔡静
二、带参数的宏替换/宏定义 带参数的宏替换 宏定义
格式: #define 宏名 形参表 宏名(形参表 形参表) 例:#define S(M, N) M*N
字符串
说明: 带参数的宏定义不是进行简单字符串替换,还要进行参数 替换。形参表列中的参数出现在字符串中。 宏展开只是将程序语句中宏名后括号内的实参代替 #define命令中的形参,并不计算。 宏名与其后括号间不能有空格。 例9.3-9.5:
c语言编译预处理及位运算习题答案
![c语言编译预处理及位运算习题答案](https://img.taocdn.com/s3/m/df0bf7bdc850ad02df8041a7.png)
编译预处理习题单项选择题1.在宏定义#define A 3.897678 中,宏名A代替一个( )。
A) 单精度数 B ) 双精度数 C ) 常量D) 字符串2.以下叙述中正确的是A)预处理命令行必须位于源文件的开头B)在源文件的一行上可以有多条预处理命令C)宏名必须用大写字母表示D)宏替换不占用程序的运行时间3.C语言的编译系统对宏命令的处理( )。
A)在程序运行时进行的B)在程序连接时进行的C)和C程序中的其它语句同时进行的D)在对源程序中其它语句正式编译之前进行的4.在文件包含预处理语句的中,被包含文件名用“< >”括起时,寻找被包含文件的方式是( )。
A)直接按系统设定的标准方式搜索目录B)先在源程序所在目录搜索,再按系统设定的标准方式搜索C)仅仅在源程序所在目录搜索D)仅仅搜索当前目录5.以下说法中正确的是A) #define 和printf 都是C语句 B ) #define 是C语句,而printf 不是C) printf 是C语句,但#define 不是D) #define 和printf 都不是C语句6.#define A 3.897678 #include <stdio.h>main(){ printf( "A=%f ,A);}程序运行结果为( )。
A) 3.897678=3.897678 B ) 3.897678=A C) A=3.897678 D ) 无结果7.有宏定义:#define LI(a,b) a*b#define LJ(a,b) (a)*(b)在后面的程序中有宏引用:x=LI(3+2,5+8);y=LJ(3+2,5+8);则x、y的值是( )。
A) x=65,y=65 B) x=21,y=65 C ) x=65,y=21 D ) x=21,y=218.有以下程序# define f(x) (x*x) main(){ int i1, i2;i1=f(8)/f(4) ; i2=f(4+4)/f(2+2);printf("%d, %d\n”,i1,i2); }程序运行后的输出结果是A) 64, 28 B) 4, 4 C) 4, 3 D) 64, 649.以下程序的输出结果是#define M(x,y,z) x*y+zmain(){ int a=1,b=2, c=3;printf( "%d n" , M(a+b,b+c, c+a));}A) 19 B) 17 C) 15 D) 1210.有以下程序#define N 5#define M1 N*3#define M2 N*2main(){ int i;i=M1+M2; printf( "%d n”,i);}程序编译后运行的输出结果是:A) 10 B) 20 C) 25 D) 3011.有如下程序#define N 2#define M N+1#define NUM 2*M+1#main(){ int i;for(i=1;i<=NUM;i++)printf( "%d n" ,i);}该程序中的for循环执行的次数是A) 5 B) 6 C) 7 D) 812.位运算是对运算对象按二进制位进行操作的运算,运算的对象是数据,以―的形式参与运算。
C语言习题七编译预处理
![C语言习题七编译预处理](https://img.taocdn.com/s3/m/0e30e759fad6195f302ba609.png)
习题七编译预处理1.有一个名为init.txt的文件,内容如下:#define HDY(A,B) A/B#define PRINT(Y) printf("y=%d\n",Y)有以下程序#include "init.txt"main(){ int a=1,b=2,c=3,d=4,k;k=HDY(a+c,b+d);PRINT(k);}下面针对该程序的叙述正确的是______。
A、编译出错B、运行出错C、运行结果为 y=0D、运行结果为 y=6解析:本题考查的是带参数的宏定义。
宏替换后,表达式k=HDY(a+c,b+d)即变为k=a+c/b+d=1+3/2+4=6。
故本题答案选D。
2.有以下程序#include <stdio.h>#define N 5#define M N+1#define f(x) (x*M)main(){ int i1,i2;i1=f(2);i2=f(1+1);printf ("%d %d\n",i1,i2);}程序的运行结果是______。
A、12 12B、11 7C、11 11D、12 7解析:本题考查的是宏定义。
在编译时预处理程序用"替换文本"来替换宏,并用对应的实参来替换"替换文本"。
此题中的替换文本分别为:N+1、(x*M)。
引用带参的宏名i1=f(2),在经过宏替换后i1=2*N+1=2*5+1=11(注:因为在对宏 M 的替换中N+1没有加括号,所以对宏f(x)的替换文本展开后就变为:x*N+1形式);与上相同 i2在引用带参的宏名并替换展开后变为:i2=1+1*N+1=1+1*5+1=7。
故本题答案为B。
3.以下叙述中错误的是______。
A、C程序中的#include和#define行均不是C语句B、除逗号运算符外,赋值运算符的优先级最低C、C程序中,j++;是赋值语句D、C程序中,+、-、*、/、%号是算术运算符,可用于整型和实型数的运算解析:本题考查的是C语言运算符。
C语言程序设计-谭浩强-第9章预处理命令
![C语言程序设计-谭浩强-第9章预处理命令](https://img.taocdn.com/s3/m/6fb617bef121dd36a32d8291.png)
17/14
§9.1 宏定义 宏体可缺省,表示宏名
不带参数宏定义
定义过或取消宏体
一般形式: 宏体] 一般形式: #define 宏名 [宏体 宏体 功能:用指定标识符 宏名)代替字符序列 宏体) 用指定标识符(宏名 代替字符序列(宏体 功能 用指定标识符 宏名 代替字符序列 宏体
如 #define 定义位置:任意YES 1 一般在函数外面) 定义位置 任意(一般在函数外面 任意 一般在函数外面 #define 例 NO 0 YES #define 1 作用域:从定义命令到文件结束 作用域 从定义命令到文件结束 main() #define PI 3.1415926 #define OUT printf(“Hello,World”); { …….. YES原作用域 #undef可终止宏名作用域 可 } 格式: 格式: #undef 宏名 #undef YES 宏展开:预编译时,用宏体替换宏名 用宏体替换宏名---不作语法检查 宏展开:预编译时 用宏体替换宏名 不作语法检查 #define YES 0 max() 引号中的内容与宏名相同也不置换 YES新作用域 {…….. if(x==YES)WIDTH 80 如 例 #define WIDTH 80 printf(“correct!\n”); 例 #define 宏定义可嵌套, 宏定义可嵌套,不能递归 } else if (x==NO)( WIDTH+40 ) printf(“error!\n”); #define #define LENGTH 3.14159 例 #define PI LENGTH WIDTH+40 宏定义中使用必要的括号() 宏定义中使用必要的括号() 展开后: if(x==1) 展开后var=LENGTH*2; : var=LENGTH*2;printf(“correct!\n”); (×) printf(“2*PI=%f\n”,PI*2); 例 #define MAX MAX+10 × else 宏展开: 宏展开: :printf(“2*PI=%f\n”,3.14159*2); 宏展开 宏展开:var= ((x==0) ) * 2;printf(“error!\n”); 宏展开: if 80+40 宏展开 :var= 80+40*2;
C语言预处理命令总结大全:宏定义
![C语言预处理命令总结大全:宏定义](https://img.taocdn.com/s3/m/eea34553a9956bec0975f46527d3240c8447a13d.png)
C语⾔预处理命令总结⼤全:宏定义C程序的源代码中可包括各种编译指令,这些指令称为预处理命令。
虽然它们实际上不是C语⾔的⼀部分,但却扩展了C程序设计的环境。
本节将介绍如何应⽤预处理程序和注释简化程序开发过程,并提⾼程序的可读性。
ANSI标准定义的C语⾔预处理程序包括下列命令:#define,#error,#include,#if,#else,#elif,#endif,#ifdef,#ifndef,#undef,#line,#pragma等。
⾮常明显,所有预处理命令均以符号#开头,下⾯分别加以介绍。
⼀ #define命令#define定义了⼀个标识符及⼀个串。
在源程序中每次遇到该标识符时,均以定义的串代换它。
ANSI标准将标识符定义为宏名,将替换过程称为宏替换。
命令的⼀般形式为:#define ID string注意:1该语句没有分号。
在标识符和串之间可以有任意个空格,串⼀旦开始,仅由⼀新⾏结束。
2宏名定义后,即可成为其它宏名定义中的⼀部分。
3 宏替换仅仅是以⽂本串代替宏标识符,前提是宏标识符必须独⽴的识别出来,否则不进⾏替换。
例如:#define XYZ this is a tes使⽤宏printf("XYZ");//该段不打印"this is a test"⽽打印"XYZ"。
因为预编译器识别出的是"XYZ"4如果串长于⼀⾏,可以在该⾏末尾⽤⼀反斜杠' \'续⾏。
#defineLONG_STRING"this is a very long\string that is used as an example"5 C语⾔程序普遍使⽤⼤写字母定义标识符。
6 ⽤宏代换代替实在的函数的⼀⼤好处是宏替换增加了代码的速度,因为不存在函数调⽤的开销。
但增加速度也有代价:由于重复编码⽽增加了程序长度。
C语言程序设计习题集3
![C语言程序设计习题集3](https://img.taocdn.com/s3/m/6d621e7049d7c1c708a1284ac850ad02de80074d.png)
C语⾔程序设计习题集3指针⼀单项选择题(每题2分,共40分)1 以下叙述中错误的就是_B__。
A 在程序中凡就是以“#”开始的语句⾏都就是预处理命令⾏B 预处理命令⾏的最后不能以分号表⽰结束C #define MAX就是合法的宏定义命令⾏D C程序对预处理命令⾏的处理就是在程序执⾏的过程中进⾏的2 若程序中有宏定义⾏:#define N 100 ,则以下叙述中正确的就是__B_。
A 宏定义⾏中定义了标识符N的值为整数100B 在编译程序对C源程序进⾏预处理时⽤100替换标识符NC 对C源程序进⾏编译时⽤100替换标识符ND 在运⾏时⽤100替换标识符3 若有如下宏定义:#define N 2#define y(n) ((N+1)*n)则执⾏下列语句:z=4*(N+y(5));后的结果就是_B__。
A 语句有错误B z值为68C z值为60D z值为1804 以下程序运⾏后的输出结果就是_A__。
#define F(X,Y) (X)*(Y)main(){ int a=3,b=4;printf("%d\n",F(a++,b++));}A 12B 15C 16D 205 以下程序运⾏后的输出结果就是_C__。
#define f(x) (x*x)main(){ int i1,i2;i1=f(8)/f(4); i2=f(4+4)/f(2+2);printf("%d,%d\n",i1,i2);}A 64,28B 4,4C 4,3D 64,646 若已定义a为int型变量,则__D_就是对指针变量p的正确说明与初始化。
A int p=&a;B int *p=a;C int *p=*a;D int *p=&a;7 已知下列说明语句:static int a[]={2,4,6,8}static int *p[]={a,a+1,a+2,a+3};int **q;q=p;则表达式**(q+2)的值就是_A__。
C语言-预处理命令
![C语言-预处理命令](https://img.taocdn.com/s3/m/b409021e650e52ea5518984f.png)
我们可以在C源程序中插入传给编译程序的各中指令,这些指令被称为预处理器指令,它们扩充了程序设计的环境。
现把常用的预处理命令总结如下:1. 预处理程序按照ANSI标准的定义,预处理程序应该处理以下指令:#if #ifdef #ifndef #else #elif#endif#define#undef#line#error#pragma#include显然,上述所有的12个预处理指令都以符号#开始,,每条预处理指令必须独占一行。
2. #define#define指令定义一个标识符和一个串(也就是字符集),在源程序中发现该标识符时,都用该串替换之。
这种标识符称为宏名字,相应的替换称为宏代换。
一般形式如下:#define macro-name char-sequence这种语句不用分号结尾。
宏名字和串之间可以有多个空白符,但串开始后只能以新行终止。
例如:我们使用LEFT代表1,用RIGHT代表0,我们使用两个#define指令:#define LEFT 1#define RIGHT 0每当在源程序中遇到LEFT或RIGHT时,编译程序都用1或0替换。
定义一个宏名字之后,可以在其他宏定义中使用,例如:#define ONE 1#define TWO ONE+ONE#define THREE ONE+TWO宏代换就是用相关的串替代标识符。
因此,如果希望定义一条标准错误信息时,可以如下定义:#define ERROR_MS “Standard error on input \n”如果一个串长于一行,可在行尾用反斜线”\”续行,如下:#define LONG_STRING “This is a very very long \String that i s used as an example”3. #error#error指令强制编译程序停止编译,它主要用于程序调试。
#error指令的一般形式是:#error error-message注意,宏串error-message不用双引号包围。
10_c语言编译预处理
![10_c语言编译预处理](https://img.taocdn.com/s3/m/d3da5c477cd184254a353513.png)
编译预处理学习要点:1.C程序中,以“#”符号开头的命令是在源程序正式编译前进行处理的,称为“编译预处理”命令。
注意,这里是“命令”,而不是语句,因此最后不能加分号。
一行只能写一个预处理命令行。
C程序中,“宏名”一般用大写,并且中间不能有空格。
2.“宏”定义的作用是当程序中出现“宏名”时,就在“宏名”的位置用对应的“一串符号”替换。
注意,这里纯粹就是“替换”,相当于用“一串符号”去“涂改” “宏名”。
如:#define PI 3.1416 程序中有a=r*r* PI ; 则替换为a=r*r* 3.1416 ;3.带参的“宏”定义也纯粹就是替换。
进行宏替换时,先用实参替换“一串符号”中的形参,然后再用被替换过的“一串符号”替换“宏名(形参表)”。
4.程序中,用双引号括起来的不是宏,不被替换。
5.对带参的“宏”定义,在替换时不要人为的加“括号”。
如:#define W(r) 3.14*r*r 当a=W(a+b); 正确的替换是a=3.14*a+b*a+b; 而不是a=3.14*(a+b)*(a+b) 这两个括号是人为加的。
当然,如果我们是想求半径为a+b的面积时就发生了错误,这时应该把“宏”定义写成#define W(r) 3.14*(r)*(r) 因此,为了在调用过程中不出现二义性,应该把字符序列中出现的参数全部用括号括起来。
6.文件包含编译预处理命令有两种格式:”包含文件名” 和<包含文件名>。
前者,系统先在本程序文件所在的磁盘和路径下寻找包含文件;若找不到,再按系统规定的路径搜索包含文件。
后者,系统仅按系统规定的路径搜索包含文件。
7.“包含文件”可以是任意的文件名扩展名,可以是 .h 也可以是.c ,还可以是其他扩展名。
文件名前还可以加上路径,如:#incl ude “d:\user\file1.c”8.带参数的main()函数是用于在用命令行的形式运行.exe程序文件时接收参数的。
C语言预处理命令
![C语言预处理命令](https://img.taocdn.com/s3/m/c07182dea58da0116c174967.png)
编译预处理作业
程序2: 程序 : # include <stdio.h> int square(int x) {return(x*x); } main() {int i=1; while(i<=5) printf("%d\n",square(i++)); }
编译预处理
文件包含 格式1: 格式1: 文件标识” #include “[d:][path] 文件标识” 按路径搜索….h文件,若找不到, .h文件 按路径搜索 .h文件,若找不到,则按 系统指定的目录搜索。 系统指定的目录搜索。 格式2: 格式2: <头文件名 头文件名> #include <头文件名> 仅按系统指定的目录搜索。 仅按系统指定的目录搜索。Turbo C 默 认为tc include目录 VC安装路径下 tc\ 目录。 认为tc\include目录。VC安装路径下 的include 目录
编译预处理
对语句a=SQARE(n+1) 对语句a=SQARE(n+1) 1、将替换为a=n+1*n+1; 将替换为a=n+1*n+1; 2、将替换为a=(n+1)*(n+1); 将替换为a=(n+1)*(n+1); 将替换为a=((n+1)*(n+1)); 3、将替换为a=((n+1)*(n+1)); 对语句a=2.7/SQARE(3.0) 对语句a=2.7/SQARE(3.0) 将替换为a=2.7/(3.0)*(3.0); 2、将替换为a=2.7/(3.0)*(3.0); 将替换为a=2.7/((3.0)*(3.0)); 3、将替换为a=2.7/((3.0)*(3.0));
预处理习题
![预处理习题](https://img.taocdn.com/s3/m/4c5d6d543b3567ec102d8a25.png)
。
6、设有宏定义“#define AREA(a,b)a*b”,则 正确的“宏调用”是 。
A、s=AREA(r*r) B、s=AREA(x*y) C、s=AREA D、s=c*AREA((x=3.5),(y+4.1))
7、设有以下宏定义,则执行语句 “z=2*(N+Y(5+1));” 后,z的值是
#define N 3 #define Y(n) ((N+1)*n)
28、分析以下程序的执行结果。
#include <stdio.h> #define PR(x,y,z) printf("x=%d y=%d z=%d\n",x,y,z) main() { int x,y,z; x=y=z=2;++x||++y&&++z;PR(x,y,z); x=y=z=2;++x&&++y||++z;PR(x,y,z); x=y=z=2;++x&&++y&&++z;PR(x,y,z); x=y=z=-2;++x||++y&&++z;PR(x,y,z); x=y=z=-2;++x&&++y||++z;PR(x,y,z); x=y=z=-2;++x&&++y&&++z;PR(x,y,z); }
24、设有如下宏定义:
#define MYSWAP(z,x,y) {int z=x;x=y;y=z;}
C语言预处理命令详解
![C语言预处理命令详解](https://img.taocdn.com/s3/m/20959b73178884868762caaedd3383c4bb4cb4c6.png)
C语⾔预处理命令详解⼀前⾔预处理(或称预编译)是指在进⾏编译的第⼀遍扫描(词法扫描和语法分析)之前所作的⼯作。
预处理指令指⽰在程序正式编译前就由编译器进⾏的操作,可放在程序中任何位置。
预处理是C语⾔的⼀个重要功能,它由预处理程序负责完成。
当对⼀个源⽂件进⾏编译时,系统将⾃动引⽤预处理程序对源程序中的预处理部分作处理,处理完毕⾃动进⼊对源程序的编译。
C语⾔提供多种预处理功能,主要处理#开始的预编译指令,如宏定义(#define)、⽂件包含(#include)、条件编译(#ifdef)等。
合理使⽤预处理功能编写的程序便于阅读、修改、移植和调试,也有利于模块化程序设计。
本⽂参考诸多资料,详细介绍常⽤的⼏种预处理功能。
因成⽂较早,资料来源⼤多已不可考,敬请谅解。
⼆宏定义C语⾔源程序中允许⽤⼀个标识符来表⽰⼀个字符串,称为“宏”。
被定义为宏的标识符称为“宏名”。
在编译预处理时,对程序中所有出现的宏名,都⽤宏定义中的字符串去代换,这称为宏替换或宏展开。
宏定义是由源程序中的宏定义命令完成的。
宏替换是由预处理程序⾃动完成的。
在C语⾔中,宏定义分为有参数和⽆参数两种。
下⾯分别讨论这两种宏的定义和调⽤。
2.1 ⽆参宏定义⽆参宏的宏名后不带参数。
其定义的⼀般形式为:#define 标识符字符串其中,“#”表⽰这是⼀条预处理命令(以#开头的均为预处理命令)。
“define”为宏定义命令。
“标识符”为符号常量,即宏名。
“字符串”可以是常数、表达式、格式串等。
宏定义⽤宏名来表⽰⼀个字符串,在宏展开时⼜以该字符串取代宏名。
这只是⼀种简单的⽂本替换,预处理程序对它不作任何检查。
如有错误,只能在编译已被宏展开后的源程序时发现。
注意理解宏替换中“换”的概念,即在对相关命令或语句的含义和功能作具体分析之前就要进⾏⽂本替换。
【例1】定义常量:1#define MAX_TIME 1000若在程序⾥⾯写if(time < MAX_TIME){.........},则编译器在处理该代码前会将MAX_TIME替换为1000。
C语音编译预处理练习题
![C语音编译预处理练习题](https://img.taocdn.com/s3/m/ca61378471fe910ef12df815.png)
一、答案判断题:×√√××××√二、选择题:ADCBA DCDBB DDACB DDCC一、判断题1. C语言预编译命令#include<myfile.h>与#include"myfile.h"的功能是完全一样的。
()2. 宏定义不是C语句,不必在行末加分号。
()3. C语言的编译系统对宏命令的处理是在对源程序中其他成份正式编译之前进行的。
()4. 若有宏定义:#define M(x,y,z)x*y+z,则宏引用M(2+3,4+5,6+7)通过宏展开后的表达式应为(2+3)*(4+5)+6+7。
5. #define与typedef的作用完全相同。
()6. 宏定义后一定要有分号。
()7. C语言的编译系统对宏命令的处理是在程序连接时进行的。
()8. 宏定义不是C语句,不必在行末加分号。
()二、单选题1. 如果程序中有#include"文件名"则意味着()。
(A)将"文件名"所指的该文件的全部内容,复制插入到此命令行处。
(B)指定标准输入输出(C)宏定义一个函数(D)条件编译说明2. 以下有关宏替换的叙述不正确的是()。
(A)宏替换不占用运行时间(B)宏名无类型(C)宏替换只是字符串替换;(D)宏替换是在运行时进行的3. 如果有#define f(x,y)x+y及int a=2,b=3;则执行printf("%d",f(a,b)*f(a,b))后的值为()。
(A)36(B)25(C)11(D)134. 若#include后面的文件名用双引号括起来,寻找被包含文件的方式是()。
A)先按系统设定的标准方式查找,再在当前目录中查找B)先在当前目录中查找,再按系统设定的标准方式查找C)只在当前目录中查找D)只按系统设定的标准方式查找5. 若程序中有#include"文件名",则意味着()。
二级c语言第九章预处理命令
![二级c语言第九章预处理命令](https://img.taocdn.com/s3/m/1f738426bed5b9f3f90f1c8a.png)
如果在程序中有下面的语句: 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语言的预处理功能是指 C语言的预处理命令只能实现宏定义和条件编译功能
![C语言的预处理功能是指 C语言的预处理命令只能实现宏定义和条件编译功能](https://img.taocdn.com/s3/m/c0a05c21fe00bed5b9f3f90f76c66137ee064fe7.png)
C语言的预处理功能是指 C语言的预处理命令只能实现宏定义和条件编译功能什么是预处理功能在介绍C语言的预处理功能之前,首先我们需要了解什么是预处理功能。
预处理器是C语言的一个重要组成部分,它负责在实际编译之前对源代码进行预处理。
预处理器会对源代码进行一系列的处理,包括宏定义、条件编译、文件包含等等。
C语言的预处理功能是指预处理命令所能实现的功能,其中包括宏定义和条件编译两大主要功能。
宏定义宏定义是C语言中非常重要的一个特性,它使得程序员能够在源代码中定义一些特定的标识符,以便在后续的代码中使用。
宏定义的语法比较简单,一般的格式为 #define 宏名替换文本。
宏定义提供了一种简单且高效的方式来进行代码重用和代码替换。
在预处理阶段,预处理器会根据宏定义的规则将源代码中的宏名替换为对应的替换文本。
宏定义不仅仅可以用来简单的替换文本,在替换文本中还可以使用参数。
这种带有参数的宏定义被称为带参数的宏定义。
带参数的宏定义使得代码更加灵活和可重用。
例如,我们可以定义一个求平方的宏定义,如下所示:#define SQUARE(x) ((x) * (x))在代码中使用宏定义非常简洁,只需要在需要求平方的地方使用宏名即可:int num = 5;int square = SQUARE(num);预处理器会将代码中的 SQUARE(num) 替换为 ((num) * (num)),最终得到的结果是 int square = ((num) * (num));。
条件编译条件编译是C语言预处理功能的另一个重要方面。
条件编译允许程序根据一些条件选择性地编译特定的代码块,从而实现不同平台的适配或者特定条件下的代码执行。
条件编译使用了一些预处理命令,例如 #if、#else、#endif 等等。
条件编译的语法比较灵活,可以根据不同的条件编译不同的代码段。
例如,我们可以使用条件编译来在不同的操作系统下进行适配:#ifdef _WIN32// Windows平台相关代码#else// 非Windows平台相关代码#endif在上述代码中,#ifdef _WIN32 表示如果定义了 _WIN32 这个宏,则编译下方的代码块,否则编译上方的代码块。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第六章预处理命令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.下面叙述中正确的是()。
A.#define和printf都是C语句B.#define是C语句,而printf不是C.printf是C语句,但#define不是D.#define和printf都不是C语句8.以下叙述中正确的是()。
A. 用#include包含的头文件的后缀不可以是“.a”B. 若一些源程序中包含某个头文件;当该头文件有错时,只需对该头文件进行修改,包含此头文件所有源程序不必重新进行编译C. 宏命令行可以看作是一行C语句D. C编译中的预处理是在编译之前进行的9.下列程序运行结果为()。
#define R 3.0#define PI 3.1415926#define L 2*PI*R#define S PI*R*Rmain(){printf("L=%f S=%f\n",L,S);}A. L=18.849556 S=28.274333B. 18.849556=18.849556 28.274333=28.274333C. L=18.849556 28.274333=28.274333D. 18.849556=18.849556 S=28.27433310.以下程序执行的输出结果是( )。
#define MIN(x,y) (x)<(y)?(x):(y)main(){int i,j,k;i=10;j=15;k=10*MIN(i,j);printf("%d\n",k);}A.15B.100C.10D.15011.下列程序执行后的输出结果是( )。
#define MA(x) x*(x-1)main(){int a=1,b=2;printf("%d \n",MA(1+a+b));}A. 6B. 8C. 10D. 1212.以下程序的输出结果是( )。
#define M(x,y,z) x*y+zmain(){int a=1,b=2, c=3;printf("%d\n", M(a+b,b+c, c+a));}A. 19B. 17C. 15D. 12 13.程序中头文件typel.h 的内容是( )。
#define N 5#define M1 N*3程序如下:#include "type1.h"#define M2 N*2main(){int i;i=M1+M2;printf("%d\n",i);}程序编译后运行的输出结果是()。
A. 10B. 20C. 25D. 30 14.请读程序:#include<stdio.h>#define SUB(X,Y) (X)*Ymain(){int a=3, b=4;printf("%d", SUB(a++, b++));}上面程序的输出结果是()。
A. 12B. 15C. 16D. 20 15.执行下面的程序后,a的值是( )。
#define SQR(X) X*Xmain( ){int a=10,k=2,m=1;a/=SQR(k+m)/SQR(k+m);printf("%d\n",a);}A. 10B. 1C. 9D. 0 16.设有以下宏定义#define N 3#define Y(n) ((N+1)*n)则执行语句:z=2 * (N+Y(5+1));后,z的值为( )。
A. 出错B. 42C. 48D. 54 17.以下程序的输出结果是( )。
#define f(x) x*xmain( ){int a=6,b=2,c;c=f(a) / f(b);printf("%d\n",c);}A. 9B. 6C. 36D. 1818.有如下程序#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. 5B. 6C. 7D. 819.执行如下程序后,输出结果为()。
#include <stdio.h>#define N 4+1#define M N*2+N#define RE 5*M+M*Nmain(){printf("%d",RE/2);}A.150B.100C. 41D.以上结果都不正确20.以下程序的输出结果是()。
#define LETTER 0main(){char str[20]= "C Language",c;int i;i=0;while((c=str[i])!=’\0’){i++;#if LETTERif(c>=’a’&&c<=’z’) c=c-32;#elseif(c>=’A’&&c<=’Z’) c=c+32;#endifprintf("%c",c);}}A. C LanguageB. c languageC. C LANGUAGED. c LANGUAGE 6.2 填空题1.以下程序的输出结果是________。
#define MAX(x,y) (x)>(y)?(x):(y)main(){int a=5,b=2,c=3,d=3,t;t=MAX(a+b,c+d)*10;printf("%d\n",t);}2.下面程序的运行结果是________。
#define N 10#define s(x) x*x#define f(x) (x*x)main(){int i1,i2;i1=1000/s(N);i2=1000/f(N);printf("%d,%d\n",i1,i2);}3.设有如下宏定义#define MYSWAP(z,x,y) {z=x; x=y; y=z;}以下程序段通过宏调用实现变量a、b内容交换,请填空。
float a=5,b=16,c;MYSWAP( 【1】 ,a,b);4.计算圆的周长、面积和球的体积【1】main(){float l,r,s,v;printf("input a radus: ");scanf("%f ", 【2】 );l=2.0*PI*r;s=PI*r*r;v=4.0/3*( 【3】 );printf("l=%.4f\n s=%.4f\n v=%.4f\n",l,s,v);}5.计算圆的周长、面积和球的体积#define PI 3.1415926#define 【1】 L=2*PI*R; 【2】 ;main(){float r,l,s,v;printf("input a radus: ");scanf("%f",&r);CIRCLE(r,l,s,v);printf("r=%.2f\n l=%.2f\n s=%.2f\n v=%.2f\n", 【3】 );}6.3 答案及部分解析一.选择题答案1.A2.B3.B4.B5.D6.B7.D 8.D 9.A 10.A 11.B 12.D13.C 14.A 15.B 16.C 17.C 18.B19.C 20.B1. 解析:关于宏的习题,我们要牢记一点:宏展开只是简单的字符串替换。
宏名无类型,宏的参数也没有类型,所以选项A)是正确的。
宏展开是在正式编译以前进行的,不会占用程序的运行时间,而会占用编译时间,所以选项B)错误。
规定所有的编译预处理命令都不是C语言中的语句,因而,编译预处理命令不以分号作为结束符,所以选项C)错误。
头文件习惯上以“.h”为后缀,但它只是习惯而不是规定。
所以选项D)错误。
9. 解析:注意双引号中的宏名不被展开,所以输出结果为L=18.849556 S=28.274333,而不是18.849556=18.849556 28.274333=28.274333。
10.解析:宏展开就是简单的字符串替换。
语句k=10*MIN(i,j);经过宏展开为k=10*(i)<(j)?(i):(j);。
由于*号的优先级要高于<号的优先级,因此要先进行10*(i)的运算;把值带入宏展开式为k=10*10<15?10:15;,条件表达式的值为15。
所以选项A)是正确的。
20.解析:条件编译的命令总共有三种:一种是#ifdef 标识符…#else…#endif,作用是当标识符被定义过,就编译前一段程序,否则编译后一段程序;第二种是#ifdef 标识符…#else…#endif,作用是当标识符未被定义过,就编译前一段程序,否则编译后一段程序;第三种是#if 表达式…#else…#endif,作用是表达式的值为“真”时编译前一段程序,否则编译后一段程序。