C华南农业大学c语言实用_第1页
C华南农业大学c语言实用_第2页
C华南农业大学c语言实用_第3页
C华南农业大学c语言实用_第4页
C华南农业大学c语言实用_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

会计学1C华南农业大学c语言实用8.1宏定义8.1.1无参数宏定义无参数宏定义的一般形式:#define标识符字符串(常量或代码串)例:#definePI3.1415926作用:用PI来代表“3.1415926”。以一个简单的名字代替长的符号串。称这个标识符为“宏名”,在编译时将宏名替换成字符串的过程称为“宏展开”。

#define是宏定义命令。第1页/共16页例:从键盘输入字符(个数不多于100),欲统计输入字符中英文字母的个数。注:输入字符‘#’时,或输入字符个数多于100时,输入结束。#include"stdio.h"#defineMAX

100main(){intn,count=0;charch;for(n=0;n<MAX;n++){ch=getchar();if(ch==’#’)break;if(ch>=’a’&&ch<=’z’||ch>=’A’&&ch<=’Z’)count++;}printf("Thenumberofletters:%d\n",count);}第2页/共16页无参宏定义说明:为了使宏名和变量名相区别。通常宏名用大写字母表示。符号常量不仅可以定义常数,也可以定义字符、字符串、说明符号。如:#defineENDSTRING‘\0’如果程序中用双引号括住的字符串内包含与符号常量有相同的名字,预编译时并不进行宏替换。如:#defineBOOK“TheRedandTheBlack”main(){printf("%\ns",BOOK);}

运行结果:

TheRedandTheBlack如果将程序改为:#defineBOOK“TheRedandTheBlack”main(){printf("%\ns",“BOOK”);}

运行结果:

BOOK第3页/共16页无参宏定义说明(续):宏定义语句的末尾不必加分号。

例如:#defineMAXIMUM20;错误

……if(max==MAXIMUM)break;

经过宏展开后,其中的if语句变为:

if(max==20;)break;

显然,上述if语句存在语法错误。在字符串中若出现运算符,通常需在合适的位置加括号。例如:#defineS(3+4)可以用#undef命令取消宏定义。一般形式:#undef标识符第4页/共16页8.1.2带参宏定义带参宏定义的一般形式:#define标识符(形参表)字符串其中,形参表是由一个或多个形参组成。带参宏调用的一般形式:宏名(实参表);第5页/共16页例:编写一个程序,求3个数中的最大数,要求用带参数的宏实现。

#include<stdio.h>#defineMAX1(a,b)((a)>(b)?(a):(b))#defineMAX2(a,b,c)(MAX1(a,b)>(c)?MAX1(a,b):(c))main(){inta=23;printf("MAX=%d\n",MAX2(13+5,4,a));}第6页/共16页带参数的宏与函数有本质上的区别:函数在定义和调用中所使用的形参和实参都受数据类型的限制,而带参数宏的形参和实参可以是任意数据类型。函数有一定的数据类型,且数据类型是不变的。而带参数的宏一般是一个运算表达式,它没有固定的数据类型。函数调用时,先计算实参表达式的值,然后带入形参。而宏定义展开时,只是替换。函数调用是在程序运行时处理的,将分配临时的存储单元。而宏扩展是在编译时进行的,展开时即不分配内存单元,不传递值,也没有“返回值”的概念。使用宏次数多时,宏展开后源程序增长,而函数调用不使源程序变长。第7页/共16页使用带参数的宏,应注意:

1.对于宏定义的形参要根据需要加上圆括号,以免发生运算错误。

#defineMULTI(x)((x)*(x))……a=15;b=3;p=MULTI(a+b)*10;

经过预编译,该赋值语句变为:

p=((a+b)*(a+b))*10;

如果定义中没有使用相应的括号,定义为:

#defineMULTI(x)(x*x)

预编译后的赋值语句变为:

p=a+b*a+b*10;

显然与原题意不符。

2.宏名与括号之间不能有空格。

#defineS(r)

PI*r*r错第8页/共16页8.2文件包含文件包含也是一种预处理语句,它的作用是使一个源程序文件将另一个源程序文件的全部包含进来。一般形式为:#include<文件名>或#include“文件名”第9页/共16页“文件包含”示意图file1.cfile2.cfile1.c

包含#include”file2.c”B

ABA(a)(b)(c)第10页/共16页8.3条件编译8.3.1条件编译命令的形式常用的有三种形式:形式一:

#ifdef宏名程序段1;

#else

程序段2;

#endif

或者:#ifdef宏名程序段;#endif第11页/共16页8.3.1条件编译命令的形式(续)

形式二:

#ifndef宏名程序段1;

#else

程序段2;

#endif其中,#ifndef语句的功能与#ifdef相反,如果宏名未定义则编译程序段1,否则编译程序2。

或者:#ifndef宏名程序段;#endif第12页/共16页8.3.1条件编译命令的形式(续)

形式三:

#if常数表达式程序段1;

#else

程序段2;

#endif

功能:首先计算“常数表达式”的值,如果为真(非零),就编译“程序段1”,否则编译“程序段2”。如果没有#else部分,则当“常数表达式”的值为0时,直接跳过#endif。或者:#if常数表达式程序段;#endif第13页/共16页例:阅读程序。#include<stdio.h>main(){#ifNULLprintf("NULLisnon-zerovalue!\n");#elseprintf("NULLiszeroval

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论