conew_1.jpg
conew_2.jpg
conew_3.jpg
conew_4.jpg
conew_5.jpg
conew_6.jpg
你的位置:免费特黄一级欧美片久久久久 > 91狠狠久久青青 > 俺来也久久婷婷天天 c说话门径的预惩办
俺来也久久婷婷天天 c说话门径的预惩办
发布日期:2022-04-28 18:01    点击次数:132

门径的翻译环境

门径的实际环境

详解C说话门径的编译+磋磨

预界说标志

预惩办提醒#define俺来也久久婷婷天天

宏和函数的对比

预惩办操作符#和##的先容

敕令界说

预惩办提醒#include

门径的翻译环境

门径的翻译环境和实际环境

在职何c的已毕中都存在两种不同的环境

1.翻译环境便是在这环境中源代码被调换为可实际的机器提醒

2.实际环境便是实质实际代码

门径的实际环境3.运行环境

1).门径必须载入内存中,在有操作系统的环境中,这一般由操作系统完成,

在零丁的环境中,门径的载入必须由手工安排,也可能通过可实际代码置入只读内存来完成(镶嵌式)

2).门径的实际便运行,接着调用main函数

3).运行实际门径代码,这技能门径将使用一个运行时的堆栈(栈帧)(并不包括堆),在使用完后就将他的地址回收,存储函数的局部变量和复返地址,

门径同期也不错使用静态(static)内存,存储与静态内存中的变量在门径的扫数实际历程一直保存他们的值。

4).拆开门径,闲居拆开main函数,也可能不测拆开

详解C说话门径的编译+磋磨

预界说标志

__FILE__打印面前文献地点的旅途

__LINE__打印面前代码地点函数

__DATE__打印面前日历

__TIME__打印面前时分

预惩办提醒#define

define界说标志,不错晋升代码的可读性

不仅不错界说数字,也不错界说代码,关键字,好像标志,

#definem100#defineretregister//用ret来替换registr#definedo_foreverfor(;;)//死轮回#definexint*#includeintmain{retintb=10;do_forever;inta=m;//100xp=&a;//p为int*的指针变量return0;}

#definexint*typedefint*INT#includeintmain{xa,b;INTc,d;//其中只好b不是指针//因为define只完成代码的替换,替换成了int*a,b//a是指针,b不是指针//而typedef是对类型的重定名,return0;}

宏和函数的对比

define界说宏,相通是完成替换

#define机制包括一个规则,把常数替换到文本中,这种已毕边幅就叫做宏,或界说宏,

参数左括号必须与函数名紧邻,若中间又有空格,就会被讲授为stuff中的成员,不可抠门括号

#include//不不错抠门括号#definesquare(x)x*x//提议把x加个括号(x),将其当做一个全体,括号很贫穷#definedouble(x)(x)+(x)//将之当成一个全体才不错#definedoubl(x)((x)+(x))intmain{printf("%d\n", 国产精品熟女一区二区square(3));//会被替换成printf("%d",3*3);printf("%d\n",square(3+1));//7!=16,会被替换,宏的参数是完成替换的,不是贪图的,不经过任何贪图平直传往时//会被替换成printf("%d",3+1*3+1))//7//加括号就酿成了(3+1)*(3+1)printf("%d",10*double(4));//这么写亦然有问题的,会被替换成10*(4)+(4)=44printf("%d",10*doubl(4));//这么就不错了;return0;}

再调用宏的技能,最初对参数进行查验,是否有define界说的标志

宏不可递归,而函数不错

当预惩办时,字符串常量不可被替换,如printf(“”)里的不被替换

#definem100#includeintmain{intc=max(101,m);//宏替换,91狠狠久久青青printf("m=%d",m);//括号内部的m不被替换return0;}

预惩办操作符#和##的先容

#不错把参数插入到字符串中

#defineprint(x)printf("thevalueof"#x"is%d\n",x)//#x会酿成x关于的内容所关于的字符串"a"#includeintmain{printf("helloworld\n");printf("hello""world\n");//效果是一样的,//写3个printf有点冗余,inta=10;print(a);//thevalueofais10intb=20;print(b);//thevalueofbis20intc=30;print(c);//thevalueofbis30printf("");return0;}

##不错把两个标志合成一个标志,两个标志连在一路

#definecd(x,y)x##y#includeintmain{intc=100;printf("%d",cd(c,120));//替换成100120return0;}

带反作用的宏参数

最初先容一下什么是反作用

inta=1;

intb=a+1;//b=2,a=1,莫得反作用

intb=++a//b=2,而a=2这里的a便是有反作用,

#include#definemax(x,y)(x)>(y)?(x):(y)intmain{inta=5;intb=8;intc=max(a++,b++);//intc=(a++)>(b++)?(a++):(b++);替换//5>8不缔造,实际完判断语句,a和b就加1,a=6,b=9,则实际b++,但b++是先使用在++//c=9,实际完后b=10printf("%d",c);//9return0;}

宏和函数的对比

1.宏比函数在门径的畛域上和速率上更胜一筹

2.更为贫穷的是,函数在界说上罕有据类型截止,若界说int型数据,则double型数据就无法传参,而宏与类型无关,

3.定名规则,宏名全部大写,函数名不全部大写(不成文的规则)

敕令界说

#undef移除一个宏界说

#if加常量抒发式,为0为真往底下实际

#endif为#if的终端标志

#ifdef如若界说了就实际底下的代码

#ifndef如若没界说就实际底下的代码

#undef//移除一个宏界说#definem100#includeintmain{inta=m;#undefm//把界说的m取消掉printf("%d",a);//a就莫得值return0;}

//#if加常量抒发式(非0未真就往下实际,直到#endif罢手)//#endif为#if的终端标志//#if0//相配于把底下的代码给谛视掉,#defineprint1intmain{#if1-2//1为真就实际,0就为假不实际,非0为真#endif#ifprint//print为1为真就往下实际底下的代码printf("hehe");#endifreturn0;}

#includeintmain{#if1==1//判断缔造,就往下实际,从多分支只接收一个,接收完底下就不实际跳到#endif去printf("hh");#elif1==2printf("haha");#elseprintf("hehe");#endifreturn0;}

//判断是否被界说的写法#includeintmain{#ifdeftest//如若test被界说了,底下参与实际,给个0也不错printf("test");#endif#ifndefhh//如若hh不界说,底下参与编译printf("hehe");#endifreturn0;}

预惩办提醒#include

文献包含

1.平直去库函数的头文献地点的目次下查找

2.""边幅的包含文献,(1).在我方写的代码底下地点的目次去查找,(2).如若1找不到,就在库函数的头文献目次下查找

嵌套文献包含

一个头文献被调换包含两次,有点啰嗦

#pragmaonce//头文献只包含一次,无论我方写了若干此,加上这句都只用一次

头文献中的ifndef,define,endif是用来防护文献被屡次包含