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

搭建网站 网页不锈钢餐具做外贸哪个网站好

搭建网站 网页,不锈钢餐具做外贸哪个网站好,华夏运用网站,小程序云开发文档人无完人#xff0c;持之以恒#xff0c;方能见真我#xff01;#xff01;#xff01; 共同进步#xff01;#xff01; 文章目录 一、预定义符号二、#define定义常量三.、#define定义宏四、带有副作用的宏参数五、宏替换的规则六、宏和函数的对比1.宏的优势2.函数的优… 人无完人持之以恒方能见真我 共同进步 文章目录 一、预定义符号二、#define定义常量三.、#define定义宏四、带有副作用的宏参数五、宏替换的规则六、宏和函数的对比1.宏的优势2.函数的优势3.宏和函数的命名约定 一、预定义符号 上一篇讲到编译和连接这一篇就详细讲讲预处理预编译 C语⾔设置了⼀些预定义符号可以直接使⽤预定义符号也是在预处理期间处理的如下 _ _FILE_ _ __LINE__ __DATE__ __TIME__ __STDC__ 我们需要注意的是使用这些预定义符号的时候下面的两个短下划不能少并且两个短下划线之间是没有间隙的第一个只是方便我们观察实际是没有空格的 接下来我们来再详细介绍一下它们 FILE代表当前进行编译的源文件在打印时需要使用占位符%s它不仅会打印文件名还会打印文件的完整路径 LINE代表出现了这个预定义符号的行号比如这个预定义符号出现在第6行时那么它就代表6所以需要使用%d进行打印 DATE代表文件被编译时的日期打印时需要使用占位符%s TIME代表文件被编译时的具体时间具体到时分秒打印时也是使用占位符%s STDC就与编译文件的编译器有关了如果编译当前文件的编译器完全遵守了ANSI C标准那么它将会被定义并且值为1打印时需要使用%d如果该编译器不完全遵守ANSI C标准那么STDC这个预定义符号就没有被定义过如果使用它就会报错 接着我们就来使用一下这几个预定义符号首先我们来使用前4个预定义符号来打印我们源文件在编译时的各种信息 #include stdio.hint main() {printf(FILE: %s\n, __FILE__);printf(LINE: %d\n, __LINE__);printf(DATE: %s\n, __DATE__);printf(TIME: %s\n, __TIME__);return 0; }运行结果 接着我们就可以使用STDC这个预定义符号来判断我们的编译器是否完全遵循ANSI C 可以看到VS2022在运行时报错了不认识这个标识符说明我们的VS2022并没有严格遵守ANSI C标准 二、#define定义常量 #define定义常量的基本语法如下 #define name stuff其中的name就是我们定义的常量的名称stuff就是我们定义的常量的值可以是整型可以是字符串也可以是字符等等 接着我们就使用#define来定义各种类型的常量我们要注意的一点是在取名时我们的常量名最好全部大写这是我们编程的一种习惯如下 #include stdio.h#define MAX 100 #define STR I am Sam! #define CH xint main() {printf(MAX: %d\n,MAX);printf(STR: %s\n,STR);printf(CH : %c\n, CH);return 0; }需要注意的是我们再define 的时候最好不要定义分号 #define MAX 100;int a MAX;替换一下,我们就能发现问题所在 int a 100;;所以我们要尽量避免上面这种情况因为这样使用会产生很多不确定性 三.、#define定义宏 #define 机制包括了⼀个规定允许把参数替换到⽂本中这种实现通常称为宏macro或定义宏definemacro下面是宏的声明方式 #define name( parament-list ) stuff其中的parament-list 是⼀个由逗号隔开的符号表它们可能出现在stuff中要注意的是参数列表的左括号必须与name紧邻如果两者之间有任何空⽩存在参数列表就会被解释为stuff的⼀部分 是不是有点难懂我们可以看如下的例子 #define SQUARE( x ) x * x它的形式有点类似于函数前面就相当于函数名括号中就是宏的参数后面是这个宏的计算方式比如使用SQUARE(5)那么预处理后就会把这条语句转化成5*5 其中SQUARE和第一个小括号要紧紧贴在一起如果两者之间有任何空⽩存在那么(x)就会成为后面的一部分就会出错 那么我们上面写的这个宏是否就完全正确了呢其实它还存在一个问题比如我们来看一个例子 #include stdio.h#define SQUARE( x ) x * xint main() {int a 5;printf(%d\n, SQUARE(a 1));return 0; }但是要注意带入的元素的运算优先级 其中的x会直接被a1替换那么SQUARE(x)经过替换过后应该是如下的样子 a 1 * a 1 //带入a5 5 1 * 5 1但是只要我们给定义的元素加上括号就能减少错误发生的概率 那么这样是否就一定不会出错了呢这里就不卖关子了这样还是不能确保得到我们预期的结果为什么呢 #include stdio.h#define DOUBLE( x ) (x) (x)int main() {int a 5;printf(%d\n, 10 * DOUBLE(a));return 0; }按照我们的预期宏DOUBLE会帮我们计算出一个数的2倍那么这里5的2倍是10乘以10过后就变成了100那么我们来看最后的结果是否是100 10 * (a) (a) //将a替换成5之后 10 * (5) (5)这个时候就可以看出来由于*的优先级更高所以10和前面那个5结合变成了50然后5变成了55这就是55的由来所以我们可以看出光给每个参数加上()还不够我们还最好把整个式子括起来表示它们是一个整体 #define DOUBLE( x ) ((x) (x))可以看到最后结果就正确了所以总结一下在我们使用宏定义的时候我们要使用()将每个参数括起来保证每个参数是一个整体最后我们还要使用()将整个式子括起来保证整个式子是一个整体 四、带有副作用的宏参数 宏参数还有副作用是不是基本上没有听过这种说法为什么会这么说呢我们一起来学习一下 带有副作用的宏参数就是当宏参数在宏的定义中出现超过⼀次的时候如果参数带有副作⽤那么你在使⽤这个宏的时候就可能出现危险导致不可预测的后果其中副作⽤就是表达式求值的时候出现的永久性效果 我们举个栗子来看一下: //不带副作⽤ x1; //带有副作⽤ x;乍一看这两者不是一样的吗但其实并不一样因为x对x造成了永久性的效果就是对x自增了一个1而x1这个表达式对x并没有影响 接着我们来看一个例子来更好的理解我们来定义一个宏它的功能就是帮我们找到两个数中的最大数 #include stdio.h#define MAX(x,y) ( (x) (y) ? (x) : (y) ) int main() {int a 5;int b 2;int ret MAX(a, b);printf(a %d b %d ret %d\n, a, b, ret);return 0; } 这个例子的运行结果是什么呢我们预期的结果是a变成6b变成3ret则是5因为传参的时候使用的是后置所以是先使用a和b的值也就是把5和2作为参数传过去后然后a和b再所以a变成了6b变成了3ret还是5 结果如下 这里的结果和我们预期还是不一样本质还是由于在预处理阶段会将宏直接替换过来 ( (a) (b) ? (a) : (b) ) 在执行这条语句时首先会执行(a) (b)此时这里是后置所以a和b先使用再自增1由于a是5b是2ab成立了然后对a和b进行自增1a就变成了6b就变成了3 由于(a) (b)的结果为真所以最后整个三目表达式返回的就是a的结果由于这里还是后置所以返回的就是6然后对a自增1变成7所以最后ret的值就是6a的值为7b的值为3 所以我们在使用宏的时候最好不要使用带副作用的宏参数也就是使用后会对原本的参数造成永久性效果的表达式例如和- -操作 五、宏替换的规则 在程序中扩展#define定义符号和宏时需要涉及以下⼏个步骤 在调⽤宏时⾸先对参数进⾏检查看看是否包含任何由#define定义的符号。如果是它们⾸先被替换替换⽂本随后被插⼊到程序中原来⽂本的位置不做任何更改而对于宏参数名被它们的值所替换最后再次对结果⽂件进⾏扫描看看它是否包含任何由#define定义的符号。如果是就重复上述处理过程 注意 宏参数和#define定义中可以出现其他#define定义的符号比如先使用#define定义一个常量N值为100那么这个N就可以在另一个#define中出现但是对于宏不能出现递归当预处理器搜索#define定义的符号的时候字符串常量的内容并不被搜索 六、宏和函数的对比 1.宏的优势 宏通常被应⽤于执⾏简单的运算而函数则可以应用于较为复杂的场面⽐如在两个数中找出较⼤的⼀个时写成下⾯的宏更有优势⼀些 #define MAX(x,y) ( (x) (y) ? (x) : (y) ) 那为什么不⽤函数来完成这个任务原因有2点 ⽤于调⽤函数和从函数返回的代码可能⽐实际执⾏这个⼩型计算⼯作所需要的时间更多因为函数还要开辟自己的栈帧进行返回等等操作所以宏⽐函数在程序的规模和速度⽅⾯更胜⼀筹 更为重要的是函数的参数必须声明为特定的类型所以函数只能在类型合适的表达式上使⽤反之这个宏怎可以适⽤于整形、⻓整型、浮点型等可以⽤于来比较的类型宏的参数是类型⽆关的比如上面我们定义的MAX宏不仅可以比较整型同时也可以比较浮点型和长整型等等而一个函数只能比较单个数据类型 2.函数的优势 对于宏来说函数也有它的优势它们没有一定的哪一个好只有哪一个更适合我们的需求那么对比宏函数的优势如下 每次使⽤宏的时候⼀份宏定义的代码将插⼊到程序中除⾮宏⽐较短否则可能⼤幅度增加程序的⻓度宏是没法调试的而函数可以一步一步调试查看bug出现的原因宏由于类型⽆关也就不够严谨这在上面成为了它的优势但是在某些场景导致它的不够严谨这个时候就要使用函数宏可能会带来运算符优先级的问题导致程序容易出错比如忘记对参数加上()或者忘了给整个式子加上()都可能出现预期以外的结果 3.宏和函数的命名约定 ⼀般来讲函数的宏的使⽤语法很相似并且语⾔本⾝没法帮我们区分⼆者所以我们平时就通过命名来简单区分它们接下来我们来看看它们的命名约定 宏名全部大写函数名不要全部大写一般是多个单词中每个单词的首字母大写 今天的最终篇上篇就分享到这里下一篇就是C语言的最后一篇了C语言的勘破之路马上就要被我们走完了希望大家多多坚持马上就要开启我们的数据结构之旅了
http://www.zqtcl.cn/news/403675/

相关文章:

  • 网站建设案例的公司黄冈网站建设公司
  • 做淘客网站需要营业执照吗制作网站公
  • 手机网站开发的目的鲁班设计远程工作
  • 宿迁网站建设要多少钱高密市住房和城乡建设局网站
  • 咸阳网站建设公司哪家好wordpress访客ip记录
  • 厦门建设银行网站那个网站做效果图电脑配置
  • 人才网站建设医院网站建设的好处
  • 房屋装修网站模板html5做网站
  • 网站建设需要的硬件网站建设知名公司排名
  • 绥化网站建设私自搭建vps犯法吗
  • 建设专业网站哪家比较好小程序源码是什么意思
  • 网站设计一般包括什么给公司做网站数据分析
  • 网站根目录在哪里1024cctvcom戊人影祝
  • wordpress转发微信南宁seo企业优化
  • 红旗渠建设集团网站昭通网络推广
  • 海陵区建设局网站计算机网站建设考试试卷
  • 佛山做网站3lue网站开发招标网
  • 粘贴以下代码到网站首页代码的与标签之间渭南软件开发
  • 企业网站建设必要性上海网站建设报价表
  • 陕西省建设厅申报网站一个主体如何添加网站
  • 做网站业务员提成几个点wordpress 地图导航代码
  • 软件下载网站排行住房和城乡建设部办公厅网站
  • 贵阳网站建设需要多少钱百度资源搜索平台
  • 做安全防护信息的网站wordpress初始密码
  • 广东企业网站seo哪里好微信公众号怎么创建文章
  • 建行网站登录不了wordpress好主题
  • 南屏网站建设湖北省建设厅的网站
  • 有没有做花卉种子的网站啊正规网站建设服务
  • 长沙网站建设公司招聘那个建设网站好
  • 网站开发视频下载网站优化关键词排名自己怎么做