文档库 最新最全的文档下载
当前位置:文档库 › 第八章 预处理命令

第八章 预处理命令

第八章  预处理命令
第八章  预处理命令

第八章预处理命令

一、选择题

1.C语言中,宏定义有效范围从定义处开始,到源文件结束处结束,但可以用

来提前解除宏定义的作用。(0级)

A)# ifdef B)endif C)# undefine D)# undef

2.以下不正确的叙述是。(0级)

A)预处理命令都必须以“#”号开始

B)在程序中凡是以“#”号开始的语句行都是预处理命令行

C)C语言在执行过程中对预处理命令行进行处理

D)# define ABCD是正确的宏定义

3.以下正确的叙述是。(0级)

A)在程序的一行中可以出现多个有效的预处理命令行

B)使用带参宏时,参数的类型应与宏定义时的一致

C)宏替换不占用运行时间,只占编译时间

D)宏定义不能出现在函数内部

4.以下不正确的叙述是。(0级)

A)宏替换不占用运行时间

B)宏名无类型

C)宏替换只是字符替换

D)宏名必须用大写字母表示

5. 以下正确的叙述是。(0级)

A)C语言的预处理功能是指完成宏替换和包含文件的调用

B)预处理命令只能位于C源程序文件的首部

C)凡是C源程序中行首以“#”标识的控制行都是预处理命令

D)C语言的编译预处理就是对源程序进行初步的语法检查

6.在文件包含预处理语句(# include)的使用形式中,当之后的文件名用“”(双引号)

括起时,寻找被包含文件的方式是。(0级)

A)直接按系统设定的标准方式搜索目录

B)先在源程序所在目录搜索,再按系统设定的标准方式搜索

C)仅仅搜索源程序所在目录

D)仅仅搜索当前目录

7.在文件包含预处理语句(# include)的使用形式中,当之后的文件名用<>(尖引号)

括起时,寻找被包含文件的方式是。(0级)

A)直接按系统设定的标准方式搜索目录

B)先在源程序所在目录搜索,再按系统设定的标准方式搜索

C)仅仅搜索源程序所在目录

D)仅仅搜索当前目录

8.C语言的编译系统对宏命令的处理。(0级)

A)在程序运行时进行的

B)在程序连接时进行的

C)和C程序中的其它语句同时进行编译的

D)在对源程序中其它语句正式编译之前进行的

9.以下程序的输出结果是。(1级)

# define MIN(x,y) (x)<(y) ? (x) : (y)

main( )

{ int i,j,k; i=10; j=15; k=10*MIN(i,j); printf(“%d”,k); }

A)15 B)100 C)10 D)150

10.以下程序的输出结果是。(2级)

# include

# define ADD(y) 3.54+y

# define PR(a) printf(“%d”, (int)(a))

# define PR1(a) PR(a); putchar (…\n?)

main( )

{ int i=4; PR1(ADD(5)*i); }

A)20 B)23 C)10 D)0

11.以下程序的输出结果是。(2级)

# include

# define N 2

# define M N+2

# define CUBE(x) (x*x*x)

main( )

{ int i=M; i=CUBE(i); printf(“%d\n”, i); }

A)17 B)64 C)125 D)53

二、填空题

1.C提供的预处理功能主要有三种,分别是、和。(0级)

2.设有以下宏定义:# define WIDTH 80

# define LENGTH WIDTH+40

则执行赋值语句:v= LENGTH*20;(v为int型变量)后,v的值是。(2级)

3.设有以下宏定义:# define WIDTH 80

# define LENGTH (WIDTH+40)

则执行赋值语句:k= LENGTH*20;(k为int型变量)后,k的值是。(2级)

三、读程序写结果题

1.以下程序的输出结果是。(2级)

# define PR(int) printf (”int=%d\n”, int)

main( )

{ int x=1,y=1,z=1; x+=y+=z; PR(x

PR(x

PR(z+=x

}

2.以下程序的输出结果是。(2级)

# include

# define PR(a) printf (”a=%d”, (int)(a))

# define PRINT(a) PR(a); putchar(…\n?);

main( )

{ float x=3.1415,y=1.823; PRINT(2*x); PRINT(3*y*y);

}

3.以下程序的输出结果是。(2级)

# include

# define PR(a) printf (”a=%d”, (int)(a))

# define PRINT(a) PR(a); putchar(…\n?);

# define PRINT2(a,b) PR(a), PRINT(b)

# define PRINT3(a,b,c) PR(a), PRINT2(b,c)

main( )

{ float x=3.1415,y=1.823,z=0.923;

PRINT3(x,2*y,3*z)

}

4.以下程序的输出结果是。(1级)

# define A 3

# define B(a) ((A+1)*a)

main( )

{ int x; x=3*(A+B(7)); printf (”x=%4d\n”, x);

}

5.以下程序的输出结果是。(1级)

# define POWER(x) ((x)*(x))

main( )

{ int i=1; while(i<=4) printf(“%d”, POWER(i++));

}

6.以下程序的输出结果是。(1级)

main( )

{int b=5;

#define b 2

#define f(x) b*(x)

int y=3;

printf(“%d,”, f(y+1));

#undef b

printf(“%d,”, f(y+1));

#define b 3

printf(“%d\n”, f(y+1));

}

7.以下程序的输出结果是。(2级)

#define DEBUG

main( )

{int a=14,b=15,c; c=a/b;

# ifdef DEBUG

printf(“a=%d,b=%d,”,a,b);

#endif

printf(“c=%d\n,”,c);

}a=14,b=15,c=0

8.以下程序的输出结果是。(2级)

main( )

{int a=20,b=10,c; c=a/b;

# ifdef DEBUG

printf(“a=%d,b=%d,”,a,b);

#endif

printf(“c=%d\n,”,c);

}

四、编程题

1.编写一个宏定义MY ALPHA(c),用以判定c是否是字母字符,若是,得1;否则得0。

(2级)

2.编写一个宏定义AREA(a,b,c),用于求一个边长为a、b和c的三角形的面积。其公式为:

s=(a+b+c)/2 area= s(s-a)(s-b)(s-c) (1级)

3.编写一个程序求三个数中最大者,要求用带参宏实现。(1级)

4.编写一个程序求1+2+..+n之和,要求用带参宏实现。(1级)

5.编写一个宏定义LEAPYEAR(y),用以判定年份y是否是闰年。判定标准是:若y是4的倍数且不是100的倍数或者y是400的倍数,则y是闰年。(1级)

C语言预处理命令之条件编译(#ifdef,#else,#endif,#if等)

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" 为了避免那些只能包含一次的头文件被多次包含,可以在头文件中用编译时条件来进行控制。例如: /*my.h*/ #ifndefMY_H

C中的预处理命令

C中的预处理命令是由ANSIC统一规定的,但它不是C语言的本身组成部分,不能直接对它们进行编译,因为编译程序无法识别它们。必须对程序进行通常的编译(包括词法和语法分析,代码生成,优化等)之前,先对程序中这些特殊的命令进行“预处理”,例如:如果程序中用#include命令包含一个文件“stdio.h”,则在预处理时,将stdio.h文件中的实际内容代替该命令。经过预处理后的程序就像没有使用预处理的程序一样干净了,然后再由编译程序对它进行编译处理,得到可供执行的目标代码。现在的编译系统都包括了预处理,编译和连接部分,在进行编译时一气呵成。我们要记住的是预处理命令不是C语言的一部分,它是在程序编译前由预处理程序完成的。 C提供的预处理功能主要有三种:宏定义,文件包含,条件编译。它们的命令都以“#”开头。 一,宏定义:用一个指定的标识符来代表一个字符串,它的一般形式为: #define 标识符字符串 #define PI 3.1415926 我们把标识符称为“宏名”,在预编译时将宏名替换成字符串的过程称为“宏展开”,而#define 是宏定义命令。 几个应该注意的问题: 1,是用宏名代替一个字符串,也就是做简单的置换,不做正确性检查,如把上面例子中的1写为小写字母l,预编译程序是不会报错的,只有在正式编译是才显示出来。 2,宏定义不是C语句,不必在行未加分号,如果加了分号则会连分号一起置换。 3,#define语句出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束,通常#define命令写在文件开头,函数之前,作为文件的一部分,在此文件范围内有效。4,可以用#undef命令终止宏定义的作用域。如: #define PI 3.1415926 main(){ } #undef PI mysub(){ } 则在mysub中PI 不代表3.1415926。 5,在进行宏定义时,可以引用已定义的宏名,可以层层置换。 6,对程序中用双撇号括起来的字符串内的字符,即使与宏名相同,也不进行置换。 7,宏定义是专门用于预处理命令的一个专有名词,它与定义变量的含义不同,只做字符替换不做内存分配。 带参数的宏定义,不只进行简单的字符串替换,还进行参数替换。定义的一般形式为:#define 宏名(参数表)字符串 如:#define S(a,b) a*b,具体使用的时候是int area; area=(2,3); 对带参数的宏定义是这样展开置换的:在程序中如果有带参数的宏(如area=(2,3)),则按#define命令行中指定的字符串从左到右进行置换。如果串中包含宏中的形参(如a,b),则将程序语句中的相关参数(可以是常量,变量,或表达式)代替形参。如果宏定义中的字符串中的字符不是参数字符(如上*),则保留,这样就形成了置换的字符串。 带参数的宏与函数有许多相似之处,在调用函数时也是在函数名后的括号内写实参,也要求实参与形参的数目相等,但它们之间还有很大的不同,主要有: 1,函数调用时,先求出实参表达式的值,然后代入形参,而使用带参的宏只是进行简单的字符替换。

第八章 预处理命令

第八章预处理命令 一、选择题 1.C语言中,宏定义有效范围从定义处开始,到源文件结束处结束,但可以用 来提前解除宏定义的作用。(0级) A)# ifdef B)endif C)# undefine D)# undef 2.以下不正确的叙述是。(0级) A)预处理命令都必须以“#”号开始 B)在程序中凡是以“#”号开始的语句行都是预处理命令行 C)C语言在执行过程中对预处理命令行进行处理 D)# define ABCD是正确的宏定义 3.以下正确的叙述是。(0级) A)在程序的一行中可以出现多个有效的预处理命令行 B)使用带参宏时,参数的类型应与宏定义时的一致 C)宏替换不占用运行时间,只占编译时间 D)宏定义不能出现在函数内部 4.以下不正确的叙述是。(0级) A)宏替换不占用运行时间 B)宏名无类型 C)宏替换只是字符替换 D)宏名必须用大写字母表示 5. 以下正确的叙述是。(0级) A)C语言的预处理功能是指完成宏替换和包含文件的调用 B)预处理命令只能位于C源程序文件的首部 C)凡是C源程序中行首以“#”标识的控制行都是预处理命令 D)C语言的编译预处理就是对源程序进行初步的语法检查 6.在文件包含预处理语句(# include)的使用形式中,当之后的文件名用“”(双引号) 括起时,寻找被包含文件的方式是。(0级) A)直接按系统设定的标准方式搜索目录 B)先在源程序所在目录搜索,再按系统设定的标准方式搜索 C)仅仅搜索源程序所在目录 D)仅仅搜索当前目录 7.在文件包含预处理语句(# include)的使用形式中,当之后的文件名用<>(尖引号) 括起时,寻找被包含文件的方式是。(0级) A)直接按系统设定的标准方式搜索目录 B)先在源程序所在目录搜索,再按系统设定的标准方式搜索 C)仅仅搜索源程序所在目录 D)仅仅搜索当前目录 8.C语言的编译系统对宏命令的处理。(0级) A)在程序运行时进行的 B)在程序连接时进行的 C)和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.下面叙述中正确的是()。 A.#define和printf都是C语句 B.#define是C语句,而printf不是

预处理命令行

预处理命令行都必须以【1】号开始. 答案: ======(答案1)====== # 设有以下宏定义 # define WIDTH 80 # define LENGTH (WIDTH +40) 则执行赋值语句:v= LENGTH*20;(v为int型变量)后,v的值是【1】. 答案: ======(答案1)====== 2400 设有以下宏定义 # define WIDTH 80 # define LENGTH WIDTH +40 则执行赋值语句:v= LENGTH*20;(v为int型变量)后,v的值是【1】.80+40*20 答案: ======(答案1)====== 880 以下程序的运行结果是【1】. #include #define MIN(x,y) (x)

main() { inti=10,j=15,k ; k=10*MIN(i,j); printf("%d\n",k); } 答案: ======(答案1)====== 100 下列程序运行结果为: #define P 3 #define S(a) P*a*a main() {intar; ar=S(3+5);//3*3+5*3+5 printf("\n%d",ar); } #define宏都是直接替换的,不会计算后再替换。s(3+5) = p*3+5*3+5 = 9+15+5 =29 若想计算后在替换,需要加上括号: #define S(a) P*(a)*(a)

若有宏定义如下: #define X 5 #define Y X+1 #define Z Y*X/2 则执行以下printf语句后,输出结果是(). inta;a=Y; printf("%d ",Z); printf("%d\n",--a); A) 7 6 B) 12 6 C) 12 5 D) 7 5 答案:D 请读程序: #include

编译预处理题与答案

第九章编译预处理 9.1 选择题 【题9.1】以下叙述中不正确的是。 A)预处理命令行都必须以#号开始 B)在程序中凡是以#号开始的语句行都是预处理命令行 C)C程序在执行过程中对预处理命令行进行处理 D)以下是正确的宏定义 #define IBM_PC 【题9.2】以下叙述中正确的是。 A)在程序的一行上可以出现多个有效的预处理命令行 B)使用带参的宏时,参数的类型应与宏定义时的一致 C)宏替换不占用运行时间,只占编译时间 D)在以下定义中C R是称为“宏名”的标识符 #define C R 045 【题9.3】请读程序: #define ADD(x) x+x main() { int m=1,n=2,k=3; int sum=ADD(m+n)*k; printf(“sum=%d”,sum); } 上面程序的运行结果是。 A)sum=9 B)sum=10 C)sum=12 D)sum=18 【题9.4】以下程序的运行结果是。 #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 【题9.5】在宏定义#define PI 3.14159中,用宏名PI代替一个。 A)常量B)单精度数C)双精度数D)字符串

【题9.6】以下程序的运行结果是。 #include #define FUDGE(y) 2.84+y #define PR(a) printf(“%d”,(int)(a)) #define PRINT1(a) PR(a); putchar(‘\n’) main() { int x=2; PRINT1(FUDGE(5)*x); } A)11 B)12 C)13 D)15 【题9.7】以下有关宏替换的叙述不正确的是。 A)宏替换不占用运行时间B)宏名无类型 C)宏替换只是字符替换D)宏名必须用大写字母表示 【题9.8】C语言的编译系统对宏命令的处理是。 A)在程序运行时进行的 B)在程序连接时进行的 C)和C程序中的其它语句同时进行编译的 D)在对源程序中其它成份正式编译之前进行的 【题9.9】若有宏定义如下: #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 【题9.10】若有以下宏定义如下: #define N 2 #define Y(n) ((N+1)*n) 则执行语句z=2*(N+Y(5));后的结果是。 A)语句有错误B)z=34 C)z=70 D)z无定值 【题9.11】若有宏定义:#define MOD(x,y) x%y 则执行以下语句后的输出为。 int z,a=15,b=100; z=MOD(b,a); printf(“%d\n”,z++);

c语言预处理命令总结大全

C语言预处理命令总结大全 (2012-02-13 17:18) 标签: C语言预处理分类:C编程 C程序的源代码中可包括各种编译指令,这些指令称为预处理命令。虽然它们实际上不是C语言的一部分,但却扩展了C程序设计的环境。本节将介绍如何应用预处理程序和注释简化程序开发过程,并提高程序的可读性。ANSI标准定义的C 语言预处理程序包括下列命令: #define,#error,#include,#if,#else,#elif,#endif,#ifdef,#ifndef,#undef,#line,#pragma等。非常明显,所有预处理命令均以符号#开头,下面分别加以介绍。 一 #define 命令#define定义了一个标识符及一个串。在源程序中每次遇到该标识符时,均以定义的串代换它。ANSI标准将标识符定义为宏名,将替换过程称为宏替换。命令的一般形式为: #define identifier 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 用宏代换代替实在的函数的一大好处是宏替换增加了代码的速度,因为不 存在函数调用的开销。但增加速度也有代价:由于重复编码而增加了程序长度。 二 #error 命令#error强迫编译程序停止编译,主要用于程序调试。 #error指令使预处理器发出一条错误消息,该消息包含指令中的文本.这条指令的目的就是在程序崩溃之前能够给出一定的信息。 三 #include

C语言预处理命令总结大全

C语言预处理命令总结大全 标签: C语言预处理分类:C编程 C程序的源代码中可包括各种编译指令,这些指令称为预处理命令。虽然它们实际上不是C语言的一部分,但却扩展了C程序设计的环境。本节将介绍如何应用预处理程序和注释简化程序开发过程,并提高程序的可读性。ANSI标准定义的C语言预处理程序包括下列命令: #define,#error,#include,#if,#else,#elif,#endif,#ifdef,#ifndef,#undef,#line,#pragma等。非常明显,所有预处理命令均以符号#开头,下面分别加以介绍。 一 #define 命令#define定义了一个标识符及一个串。在源程序中每次遇到该标识符时,均以定义的串代换它。ANSI标准将标识符定义为宏名,将替换过程称为宏替换。命令的一般形式为: #define identifier 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 用宏代换代替实在的函数的一大好处是宏替换增加了代码的速度,因为不存在函数调用 的开销。但增加速度也有代价:由于重复编码而增加了程序长度。 二 #error 命令#error强迫编译程序停止编译,主要用于程序调试。 #error指令使预处理器发出一条错误消息,该消息包含指令中的文本.这条指令的目的就是在程序崩溃之前能够给出一定的信息。 三 #include 命令#i nclude使编译程序将另一源文件嵌入带有#include的源文件,被读入的源文件必须用双引号或尖括号括起来。例如: #include"stdio.h"或者#include 这两行代码均使用C编译程序读入并编译用于处理磁盘文件库的子程序。

预处理的考试试题

(1) 下面叙述错误的是()。 A) “#define PRICE 30”命令的作用是定义一个与30等价的符号常量PRICE B) C源程序中加入一些预处理命令是为了改进程序设计环境,提高编程效率 C) “#include <>”命令的作用是在预处理时将文件中的实际内容代替该命令 D) 宏定义也是C语句,必须在行末加分号 (2) 若有定义:#define PI 3,则表达式PI*2*2的值为()。 A) 4 B) 不确定 C) 12 D) 322 (3) 以下程序的运行结果是()。 #define X a+b main( ) { int a=3,b=4,s1; s1=2*X; printf("%d\n",s1); } A) 8 B) 14 C) 10 D) 6 (4) 若有定义#define F 2+3,则表达式F*F的值为()。 A) 13 B) 17 C) 25 D) 11 (5) 下面叙述正确的是()。 A) 宏名必须用大写字母表示 B) 一个源程序只能有一个预编译处理命令行 C) 宏展开不占用运行时间,只占用编译时间 D) 预处理命令也是C语句,必须以分号结束 (6) 下列程序中定义的二维数组a的()。 # define M 3 # define N 4 void main( ) { int a[M][N]; …… }

A、第一维和第二维都为4 B、第一维和第二维都为3 C、第一维为4,第二维为3 D、第一维为3,第二维为4 (7) 下列程序的运行结果是()。 # define M 5 # define N M+1 # define NN N*N-M void main( ) { printf(“%d\n”,3*NN); } A、108 B、16 C、21 D、103 (8) 下列叙述正确的是()。 A、宏定义中的宏名必须用大写字母表示 B、为提高程序运行速度可在源程序中加入一些宏定义 C、一个C语言源程序只能有一条预处理命令 D、宏定义不占用程序运行时间,但与程序中的语句一样需要编译 (9) 下列叙述错误的是()。 A、宏定义可出现在源程序中任意合适的位置,且必须在行末加分号 B、预处理命令行都必须以#号开始 C、C语言源程序中加入一些预处理命令是为了改进程序设计环境,提高编程效率 D、# define PER 的作用是用标识符PER代表 (10) 下列程序的运行结果是()。 # define K 5 void main( ) { int a=3,b=4; printf(“%d\n”,K*(a+b)); } A、20 B、15 C、5 D、35 (11) 以下叙述正确的是()。 A) 一个源程序只能由一个编译预处理命令行 B) 编译预处理命令都必须以"#"开头 C) "#define PRICE=30"定义了与30等价的符号常量PRICE

C语言预处理命令的总结大全

C程序的源代码中可包括各种编译指令,这些指令称为预处理命令。虽然它们实际上不是C 语言的一部分,但却扩展了C程序设计的环境。本节将介绍如何应用预处理程序和注释简化程序开发过程,并提高程序的可读性。ANSI标准定义的C语言预处理程序包括下列命令:#define,#error,#include,#if,#else,#elif,#endif,#ifdef,#ifndef,#undef,#line,#pragma等。非常明显,所有预处理命令均以符号#开头,下面分别加以介绍。 一#define 命令#define定义了一个标识符及一个串。在源程序中每次遇到该标识符时,均以定义的串代换它。ANSI标准将标识符定义为宏名,将替换过程称为宏替换。命令的一般形式为: #define identifier 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 用宏代换代替实在的函数的一大好处是宏替换增加了代码的速度,因为不存在函数调用的开销。但增加速度也有代价:由于重复编码而增加了程序长度。 二#error 命令#error强迫编译程序停止编译,主要用于程序调试。

常见的预处理命令及功能

常见的预处理命令及功能

1.常见的预处理功能: 预处理器的主要作用就是把通过预处理的内建功能对一个资源进行等价替换,最常见的预处理有:文件包含,条件编译、布局控制和宏替换4种。 文件包含:#include 是一种最为常见的预处理,主要是做为文件的引用组合源程序正文。 条件编译:#if,#ifndef,#ifdef,#endif,#undef等也是比较常见的预处理,主要是进行编译时进行有选择的挑选,注释掉一些指定的代码,以达到版本控制、防止对文件重复包含的功能。 布局控制:#progma,这也是我们应用预处理的一个重要方面,主要功能是为编译程序提供非常规的控制流信息。 宏替换:#define,这是最常见的用法,它可以定义符号常量、函数功能、重新命名、字符串的拼接等各种功能。 2.下面我们看一下常见的预处理指令: #define 宏定义 #undef 未定义宏 #include 文本包含 #ifdef 如果宏被定义就进行编译 #ifndef 如果宏未被定义就进行编译 #endif 结束编译块的控制 #if 表达式非零就对代码进行编译 #else 作为其他预处理的剩余选项进行编译 #elif 这是一种#else和#if的组合选项 #line 改变当前的行数和文件名称 #error 输出一个错误信息 #pragma 为编译程序提供非常规的控制流信息 3.下面我们对这些预处理进行一一的说明,考虑到宏的重要性和繁琐性,我们把它放到最后讲。 文件包含指令:

这种预处理使用方式是最为常见的,平时我们编写程序都会用到,最常见的用法是: #include //标准库头文件 #include //旧式的标准库头文件 #include "IO.h" //用户自定义的头文件 #include "……/file.h" //UNIX下的父目录下的头文件 #include "/usr/local/file.h" //UNIX下的完整路径 #include "……\file.h" //Dos下的父目录下的头文件 #include "\usr\local\file.h" //Dos下的完整路径 这里面有2个地方要注意: 1)我们用还是 我们主张使用,而不是,为什么呢?我想你可能还记得我曾经给出过几点理由,这里我大致的说一下:首先,h格式的头文件早在98年9月份就被标准委员会抛弃了,我们应该紧跟标准,以适合时代的发展。其次,iostream.h只支持窄字符集,iostream则支持窄/宽字符集。 还有,标准对iostream作了很多的改动,接口和实现都有了变化。最后,iostream组件全部放入namespace std中,防止了名字污染。 2)和"io.h"的区别? 其实他们唯一的区别就是搜索路径不同: 对于#include ,编译器从标准库路径开始搜索 对于#include "io.h" ,编译器从用户的工作路径开始搜索 编译控制指令: 这些指令的主要目的是进行编译时进行有选择的挑选,注释掉一些指定的代码,以达到版本控制、防止对文件重复包含的功能。 使用格式,如下: 1)#ifdef identifier your code #endif 如果identifier为一个定义了的符号,your code就会被编译,否则剔除

C语言编译预处理命令

编译预处理命令 文件包含: 把指定的文件插入到预处理命令行所在的位置并取代该命令行,即把指定的文件和当前的源程序文件连接成一个源文件。 #include<文件名> 在文件包含目录中去查找指定的文件,并将该文件添加到源文件中。 一个被包含的文件中可以含有文件包含命令来包含另一个文件。 #include“文件名” 命令中文件名的位置是当前源文件的位置,若在当前目录中未找到该文件,则再到“包含目录”中去查找。 宏 用一个标识符表示一个字符串,称为宏,被定义为宏的标识符称为宏名。在编译预处理时对程序中所有出现的宏名用宏定义中的字符串去代换,这就是宏替换。它是由系统编译程序时自动完成的。 无参宏定义 #define 标识符字符串 如 #define PI 3.14 使用宏时要注意: (1)宏定义是用宏名来表示一个字符串,在宏展开时用字符串取代宏名。(2)宏定义不是变量定义或语句,在行末不能加分号,如果加上分号则分号也成为字符串的一部分。 (3)宏定义可以出现在程序的任何地方,其作用域是宏定义命令所在位置开始到源程序结束。如果要终止其作用域可使用#undef命令。 (4)宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时将逐层替换。 (5)#define PI 3.1415926 #define AREA PI*y*y 有参宏定义 #define 宏名(形参表)字符串 对带参数的宏,在调用中不仅要进行宏展开,而且还要用实参去替换形参。 带参宏调用的语法格式如下: 宏名(实参表);

#define M(x) x+1 K=M(3); K=3+1 定义有参宏时要注意以下几点: (1)有参宏定义中,宏名和形参表之间不能有空格出现。 (2)在函数中,调用时要把实参的值赋给形参,进行“值传递”。而在带参宏调用中,只是符号替换,不存在值传递问题。 (3)宏定义中的形参只能是标识符,而宏调用中的实参可以是表达式。 宏替换中对实参表达式不做计算直接照原样替换,字符串内的形参通常用括号括起来以避免出错。 在使用宏时不仅要将形式参数用括号括起来,还应将其整体用括号括起来。 #define S(y) ((y)*(y)) 条件编译 条件编译可以按不同的条件去编译不同的程序段。 1#ifdef #ifdef 标识符 程序段1 #else 程序段2 #endif 功能:如果标识符已被#define定义过,则对程序段1进行编译,否则对程序段2进行编译。格式中的#else部分可以没有,即: #ifdef 标识符 程序段 #endif 2、#ifndef 语法格式如下: #ifndef 标识符 程序段1 #else 程序段2 #endif 功能与ifdef形式的功能正好相反。 3、#if 常量表达式 #if 常量表达式 程序段1 #else 程序段2 #endif 功能:如果常量表达式的值为真(非0),则对程序段1进行编译,否则对程序段2进行编译,因此可以使程序在不同条件下,完成不同的功能。 上面介绍的条件编译实现的逻辑也可以用条件语句来实现,但是用条件语句将会

C语言预处理命令之条件编译(ifdef,else,endif,if)

C语言预处理命令之条件编译(#ifd ef,#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" 为了避免那些只能包含一次的头文件被多次包含,可以在头文件中用编译时条件来进行控制。例如: /*my.h*/

相关文档