当前位置: 首页 > news >正文

花乡科技园区网站建设免费游戏网页

花乡科技园区网站建设,免费游戏网页,湖北大网站建设,乌尔禾区做网站哪里好0.预定义符号 在讲解#define之前先给大家介绍几个预定义符号 __FILE__ //进行编译的源文件 __LINE__ //文件当前的行号 __DATE__ //文件被编译的日期 __TIME__ //文件被编译的时间 __STDC__ //如果编译器遵循ANSI C#xff08;标准C#xff09;#xff… 0.预定义符号 在讲解#define之前先给大家介绍几个预定义符号 __FILE__      //进行编译的源文件 __LINE__     //文件当前的行号 __DATE__    //文件被编译的日期 __TIME__    //文件被编译的时间 __STDC__    //如果编译器遵循ANSI C标准C其值为1否则未定义 这些预定义符号都是编译器自带的可以直接使用我们可以用printf函数去打印。 #include stdio.hint main(){printf(%s\n,__FILE__);printf(%d\n,__LINE__);printf(%s\n,__DATE__);printf(%s\n,__TIME__);printf(%d\n,__STDC__);return 0;} 1. 语法分析 #define     name     stuff name代表的是stuff新的名字 stuff代表的是实现的内容 name的名字最好要全大写 就比如你总会用到一个数字但是你还需要将它换值如果我们不用#define来我们就需要每次都写这个值改值的时候也要一次次去修改这给我们带来了很多的麻烦所以这个时候我们可以使用#define来定义这个数值给他取个名字代表这个数值改值的时候就可以直接在#define这里修改改一次就行大大提高了写代码的效率。 记住这一点#define可以将name替换成stuff。一定是替换将name换成stuff。 比如 代码1 #include stdio.hint main(){int a 10;int b 20;int c 30;if(a 25)printf(aYES\n);if(b 25)printf(bYES\n);if(c 25)printf(cYES\n);return 0;}代码2 #define n 25int main(){int a 10;int b 20;int c 30;if(a n)printf(aYES\n);if(b n)printf(bYES\n);if(c n)printf(cYES\n);return 0;} 代码1如果修改25需要修改3次但是代码2通过#define定义后只需要修改n后面的值就行这就大大提高了修改的效率。 1.1 举例分析 1.1.1 代码1 #define MAX 100int main(){int a MAX;int a 100;return 0;} 我们来看第一个我们用#define定义了MAX的数值是100所以在主函数使用的时候 int a MAX;就相当于 int a 100; 也就是把MAX替换成了100 1.1.2 代码2 #include stdio.h #define sz sizeofint main(){int a sz(int);int b sizeof (int);printf(%d %d,a,b);return 0;}第二个代码是用#define来定义一个sz代表sizeof关键字所以在使用过程中sz(int)就可以替换成sizeof(int) 1.1.3 代码3 代码1 #include stdio.h #define do_forever for(;;)int main(){do_forever{printf(1);}return 0;} 代码2#include stdio.hint main(){for(;;){printf(1);}return 0;} 这两个代码是等效的代码1我们用#define定义了一个死循环当编译的时候do_forever就会被替换成for(;;)。 所以#define可以定义任何东西但是在使用时候会被自动替换成定义后面的东西。 1.1.4代码4 代码1 #include stdio.h #define PRINT printf(file:%s\nline:%d\ndate:%s\ntime:%s\n,__FILE__,__LINE__,__DATE__,__TIME__)int main(){PRINT;return 0;} 代码2 #include stdio.h #define PRINT printf(file:%s\n\line:%d\n\date:%s\n\time:%s\n,__FILE__,__LINE__,__DATE__,__TIME__)int main(){PRINT;return 0;} 代码3 #include stdio.hint main(){printf(file:%s\nline:%d\ndate:%s\ntime:%s\n,__FILE__,__LINE__,__DATE__,__TIME__);return 0;} 首先看代码1我们是#define定义了一个PRINT它是后面的一大串打印内容的大家是不是也会觉得很长。 所以我们优化看一下代码2我们将其回车分成了4行但是这里要记住一定要在我们敲回车的地方➕一个‘ \ ’告诉编译器这还是一个整体的内容也就是将我们敲的回车给转义了。如果不加这个’ \ ‘整体代码就会出问题。 1.2 #define末尾是否应该添加 ; 答案是最好不要加分号那又是为什么呢 我们知道#define是替换比如上面我们是将MAX直接替换成了100、sz直接替换成了sizeof、do_forever直接替换成了for(;;)等等。 那我们如果加上了分号 ; 之后呢 代码1 #define MAX 100;int main(){int a MAX;return 0;} 代码2 #define MAX 100;int main(){int a 100;;return 0;} 代码3 #define MAX 100;int main(){int a MAXreturn 0;} 首先代码1和代码2是等效的我们可以看到加了分号之后MAX是被替换成了100这里就有2个分号了肯定是错误的。 那怎么去修改呢 我们可以像代码3一样在主函数那里也就是语句结尾不加分号等替换之后就有分号了但是这跟咱们的书写习惯大大不同所以最好不要加分号 2. #define定义宏 2.1 语法分析 #define name( parament-list ) stuff 1.#define定义宏和函数很相似2.name相当于函数名3.parament-list 就相当于函数参数4.stuff就是相当于这个函数的功能 注意⚠️⚠️这里的左括号一定要跟name紧挨着                        否则会name就会被替换成( parament-list ) stuff 比如 代码1#define MAX(x,y) (x) (y) ? (x) : (y) int main() {MAX(2,3);MAX(2,3);相当于(2) (3) ? (2) : (3); }代码2#define MAX (x,y) (x) (y) ? (x) : (y) int main() {MAX(2,3);MAX相当于(x,y) (x) (y) ? (x) : (y) } 代码1是左括号紧挨着name的那我们就可以用MAX(x,y)完成我们想要实现的功能。 代码2是没有紧挨着的这时候会出现错误因为此时是MAX相当于(x,y) (x) (y) ? (x) : (y) 这时候MAX啥也不是是个错误。 所以左括号必须跟name紧挨着 总而言之还是要记住#define是替换的作用。 2.2代码举例 2.2.1 代码1 #define Square(x) x * x 我们定义了一个Square(x)它的作用是求一个数的平方参数是x Square(5); 所以我们在引用的时候给括号里数字5 5 * 5 就相当于5*5可以求出来这个数的平方。 但是如果是这样的代码结果又会是多少呢 #include stdio.h #define Square(x) x * x int main() {int a 5;printf(%d\n ,Square( a 1) );return 0; } 正确答案是11 我相信很多人都会得出36但是我们一直在说#define是替换所以上面代码又可以变成如下 #include stdio.h #define Square(x) x * x int main() {int a 5;printf(%d\n ,a 1 * a 1 );return 0; } 对吧这时候Square(a1)会被替换成 a1*a1优先乘法运算结果是11 也就是说我们#define定义的真的就是替换你给什么替换什么不会加括号所以为了算出正确结果一定要加括号在#define宏定义时候要多加括号。 正确代码 #include stdio.h #define Square(x) (x) * (x) int main() {int a 5;printf(%d\n ,Square( a 1) );return 0; } 2.2.2 代码2 #define DOUBLE(x) (x) (x) 我们看这个#define定义的DOUBLE(x) 是求一个数的二倍在这里我们给x加了括号避免了之前的错误那下面代码输出的是什么呢 int a 5; printf(%d\n ,10 * DOUBLE(a)); 我相信大多数人现在肯定是算出正确结果了因为之前吃的亏答案是55 和我们预想结果不一样呀我们预想的是100为什么不一样呢 int a 5; printf(%d\n ,10 * 5 5); 实际上DOUBLE(a)是被替换成了5 5但是前面有个10还是乘法就变成了10*55.那如何解决这个问题呢还是加括号代码如下 #define DOUBLE(x) ((x) (x)) 我们只需要整体加个括号就可以完美解决问题啦 总结 在#define定义宏的时候也就是类似函数一定要多加括号避免错误。 3.#define的替换规则 3.1 规则1 规则1 : 在调用宏时首先对参数进行检查看看是否包含任何由#define定义的符号。 如果是它们首先被替换。 这是什么意思呢我们拿代码举例 #include stdio.h #define n 100 #define MAX(x,y) ((x) (y) ? (x) : (y))int main(){int a 20;int c MAX(a,n);printf(max是%d\n,c);return 0;} 在MAX(x,y)里主函数传的参数里分别是an a是我们定义的局部变量而n是#define定义的符号所以根据规则要首先被替换。 就变成了这样 int c MAX(a,100); n被替换成了100之后再去替换#define定义的宏 int c ((a) (100) ? (a) : (100)); 3.2 规则2 规则2: 再次对结果文件进行扫描看看它是否包含任何由#define定义的符号。如果是就重复上 述处理过程。 这一点没什么说的反正就是你在#define定义的时候一定要看先发生的是谁就行。 4.‘#’和‘##’的作用 4.1‘#’作用 我们先看这样一段代码 char* p hello bit\n; printf(hello bit\n); printf(%s, p); 此时输出的是 我们可以看到两个输出的都是一样的所以我们发现字符串它是有自动连接的特点也就是说我打印完“hello ”这个字符串但是发现后面还有那就接着打印。 我们明确了这个之后思考这样一个问题 如何把参数插入到字符串中 看这样一段代码 #include stdio.h #define PRINT(n) printf(n的值是%d\n, n) int main() {int a 20;PRINT(a);return 0; } 我们用PRINT想打印传入的参数的值但是这么打印得到的结果是 首先第一点我们是要求a的值我希望打印出来可以告诉我a的值是20那这个时候‘#’就派上用场了。 #include stdio.h #define PRINT(n) printf(#n的值是%d\n, n) int main() {int a 20;PRINT(a);return 0; } 我们首先要知道printf函数是可以打印字符串的字符串有自动连接的特点 我们想把a打印到屏幕上就需要在n的前面加上‘#’这个符号#n会被替换成a #define PRINT(n) printf(#n的值是%d\n, n)PRINT(a); 替换成 printf(a的值是%d\n, a);这样我们就打印出来想要的结果了 我们解决了名字的问题但是如果输入个浮点数呢别的类型呢又该怎么办呢 #include stdio.h #define PRINT(n) printf(#n的值是%d\n, n) int main() {int a 20;PRINT(a);float b 3.14;PRINT(b);return 0; } 在这段代码里肯定是输出不来浮点数b的因为%d被写死了我们是否可以把打印的格式传参呢 #include stdio.h #define PRINT(n,format) printf(#n的值是format\n, n) int main() {int a 20;PRINT(a,%d);float b 3.14;PRINT(b,%f);return 0; } 我们是传入的字符串所以在printf里可以直接写format因为会被替换成 #define PRINT(n,format) printf(#n的值是format\n, n)PRINT(a,%d); 替换printf(a的值是%d\n, n);PRINT(b,%f); 替换printf(b的值是%f\n, n); 这样就可以打印出来任何数据类型了。 4.2 ##的作用 ##可以把位于它两边的符号合成一个符号这个用途不大但是很新奇。 比如 #define Cat(x,y) x##yint main(){int helloworld 100;printf(%d\n, Cat(hel,loworld));return 0;} 大家可以想一想输出的结果是多少 我们一步一步来先替换 Cat(hel,loworld) 替换成 hel##loworld而##还可以连接左右的符号 hel##loworld 变成 helloworld 我们这个程序输出的就是helloworld的值100.
http://www.hkea.cn/news/14493859/

相关文章:

  • 深圳网站论坛建设做期货应关注什么网站
  • 营销型网站建设新感觉建站全媒体运营师报名费多少钱
  • 建站公司合肥北京在线建站模板
  • 网站建设模块下载网站开发软件h开头的
  • 建立网站的费用南京房产网
  • 网站制作流程临沂网站建设技术支持
  • 网站维护具体做啥自己创业开网店需要什么
  • 潍坊网站建设推广报价电子商务平台的开发建设
  • 免费地方网站怎么运营自己的网站
  • 机场网站建设需求怎么查看网站的域名
  • 教育培训网站模板下载免费做ppt的网站有哪些
  • 在社保网站上怎么做员工的退费企业查查app下载
  • 交换机做网站福州直播app开发公司
  • 烟台网站制作维护统计局网站集约化建设方案
  • 汽车网站建设参考文献开题报告xammp如何按wordpress
  • 十大必做调查网站手机网站底部电话
  • 湖南营销网站建设联系方式2018年靖边建设项目招投标网站
  • 公司官方网站制作行业网站怎么建设
  • wordpress4.9+多站点网络营销是什么的基础选择题
  • 企业网站建设用标语flash网站 下载
  • 网站制作方案费用仓库管理系统界面
  • 兰州吸引用户的网站设计学做网站有用吗
  • 塘厦镇住房规划建设局网站做网站月入1000
  • 临安市建设局网站wordpress lofter
  • 开办网站原因如何在aws上创建wordpress
  • 哇塞fm网站维护发布信息的软件
  • 做纺织机械的网站域名wordpress 多站点 主题
  • 网站设计南方企业网网站建设的技术支持包括
  • seo网站文章编辑软件网站的特征包括
  • python做网站项目做一个网站成本是多少