- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
例: #define PAI 3.14159 #define Array_size 500 ? int m[Array_size]; 实际处理时: 用“ 字符串表达式”替换程序中的标识符(宏名) 相当于:int m[500]; 从开始定义的位置至文件结尾,但允许提前终止。用命令(#undef标识符) #define M 10.5 ? main ( ) { ? # undef M ? } 1. 宏定义的作用域: 作用域范围 #define PI 3.14159 #define R 3.0 #define L 2?R ?PI #define S PI ?R ?R main { ? prinf(L=%f\n S=%f\n , L, S); ? } 2. 可以嵌套定义, 即可引用已定义的宏名。 注意: 双引号“ ”中的 L 不被替换。 结论: ? 凡程序中常用到的字符序列,如:常数, 公式,均可用宏定义。 ? 经常会改变的数据可用宏定义。 结果:L=18.84954 /*L=2?3.0 ? 3.14159*/S=28.27131 /*S=3.14159?3.0 ? 3.0*/ 对“输出格式”作宏定义,可以减少书写麻烦。 例5.25 #define P printf #define D %d\n #define F %f\n main(){ int a=5, c=8, e=11; float b=3.8, d=9.7, f=21.08; P(D F,a,b); P(D F,c,d); P(D F,e,f); } 二、有参形式 形式: #define 宏名(参数表) 字符串 #define S(r ) 3.14159 ?r ?r ? S(3.0) /*相当于: 3.14159 ?3.0 ?3.0*/ S(4.0) /*相当于: 3.14159 ?4.0 ?4.0*/ ? 合适于字符串表达式序列中有变化的字符,将这部分字符可定义为参数。 例1: ?r2?3.1415?r ?r 为字符序列, 但r是可变的。 main() {int x,y,b,z; x=3;y=4; b=x+y; z=f(x+y); } 编译后: z=f(x+y) 变成: x+y*b 结果为: z=31 (这个结果有可能与初始设想不一致) 初始想法有可能是: 若有:f(x+y) 则应有:(x+y)?b 若有:f(x+y+z) 则应有:(x+y+z)?b 例2: #define f(a) a*b 1. 宏展开实质为严格的字符替换,把参数看一种 “ 字符串”,所以定义宏时要考虑实参(替换)的各种可能, 防止出现二义性。 如程序例1中:若有#define s( r) 3.14159?r?r ? 则S(a+b)的结果为: 3.24159?a+b?a+b 为避免出现错误的结果,可将宏定义修改为: #define S( r) 3.1415926?( r)?( r) 宏定义时必须注意以下几个方面: 2. 宏定义与函数是完全不同的概念。 3. 灵活运用宏定义, 可使程序书写简化. 例5.26 #define MAX(a,b) (ab)?a:b main(){ int x,y,max; printf(input two numbers: ); scanf(%d%d,x,y); max=MAX(x,y); printf(max=%d\n,max); } 例5.29使用宏定义,计算半径为2、4、6、8、10时圆的面积和圆的周长 #include stdio.h #define PI 3.141592653 #define AREA(R) PI*(R)*(R) #define PERI(R) 2*PI*(R) void main() { int r; for
文档评论(0)