[东华实业股吧]预处理02 – 零基础入门学习C语言51

第九章:预处理02

让编程改动国际

Changetheworldbyprogram

带参宏界说

C言语答应宏带有参数。在宏界说中的参数称为方式参数,在宏调用中的参数称为实践参数。

对带参数的宏,在调用中,不只要宏打开,并且要用实参去代换形参。

带参宏界说的一般方式为:

define宏名(形参表)字符串带参宏调用的一般方式为:

宏名(实参表);

例如:

defineM(y)yy+3y?/宏界说/k=M(5);?/宏调用/

在宏调用时,用实参5去替代形参y,经预处理宏打开后的句子为:

k=55+35

看实例

includedefineMAX(a,b)(a>b)?a:bvoidmain()

{?

intx,y,max;

printf("inputtwonumbers:");

scanf("%d%d",&x,&y);?

max=MAX(x,y);//max=(x>y)?x:y;

printf("Themaxis%dnn",max);

}

关于带参的宏界说有以下问题需求阐明:

带参宏界说中,宏名和形参表之间不能有空格呈现。例如把:

defineMAX(a,b)?(a>b)?a:b写为:

defineMAX?(a,b)?(a>b)?a:b试试看~

在带参宏界说中,方式参数不分配内存单元,因而不用作类型界说。而宏调用中的实参有详细的值。

要用它们去代换形参,因而必须作类型阐明。

这是与函数中的状况不同的。在函数中,形参和实参是两个不同的量,各有自己的效果域,调用时要把实参值赋予形参,进行“值传递”。

而在带参宏中,仅仅符号代换,不存在值传递的问题。

在宏界说中的形参是标识符,而宏调用中的实参可所以表达式。includedefineSAY(y)(y)voidmain()

{?

inti=0;

charsay[]={73,32,108,111,118,101,32,102,105,115,104,99,46,99,111,109,33,0};

while(say)

{

say=SAY(say*1+1-1);

i++;

}

printf("nt%snn",say);

}

在宏界说中,字符串内的形参一般要用括号括起来以防止犯错。在上例中的宏界说中(y)*(y)表达式的y都用括号括起来,因而成果是正确的。

假如去掉括号,把程序改为以下方式:

includedefineSQ(y)(y)(y)?//yy试试voidmain()

{

inta,sq;

printf("inputanumber:");

scanf("%d",&a);

sq=SQ(a+1);//sq=a+1*a+1

printf("sq=%dn",sq);

}

将比如3标题进行反常:咱们现在要160÷SQ(y)

比如03反常:

includedefineSQ(y)((y)*(y))??voidmain()

{

inta,sq;

printf("inputanumber:");

scanf("%d",&a);

sq=160/SQ(a+1);??//sq=160/((a+1)*(a+1));

printf("sq=%dn",sq);

}

带参的宏和带参函数很类似,但有本质上的不同,除上面已谈到的各点外,把同一表达式用函数处理与用宏处理两者的成果有可能是不同的。课后题:比较比较(点击下载)

宏界说也可用来界说多个句子,在宏调用时,把这些句子又代换到源程序内。看下面的比如。比如04:

includeincludedefineSTR(s1,s2,s3,sum)??strcat(strcat(strcat(sum,s1),s2),s3)voidmain()

{

charstr1[]="I",str2[]="love",str3[]="Fishc!",str[40]="";

STR(str1,str2,str3,str);//strcat(strcat(strcat(str,str1),str2),str3)

printf("ntstr1=%sntstr2=%sntstr3=%sntStr??=%snnn",str1,str2,str3,str);

str[0]=0;

STR(str2,str1,str3,str);

printf("ntstr1=%sntstr2=%sntstr3=%sntStr??=%snnn",str1,str2,str3,str);

}

视频下载
技能,IT技能,视频教程,C言语
发布于 2024-02-01 16:02:26
收藏
分享
海报
82
目录

    推荐阅读