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

企业网站建设合同怎样做一元购网站

企业网站建设合同,怎样做一元购网站,网站建设找刘贺稳营销专家,wordpress 主题猫本篇重点介绍程序的编译与链接过程中的预处理阶段#xff0c;将详细的介绍在预处理阶段会发生什么#xff0c;以及讲解有关百度该内容的面试笔试题和源于《高质量C/C编程指南》的笔试题。一.【预处理详解】①预定义符号②#define2.1 #define 定义标识符注意#xff1a;2.2 #… 本篇重点介绍程序的编译与链接过程中的预处理阶段将详细的介绍在预处理阶段会发生什么以及讲解有关百度该内容的面试笔试题和源于《高质量C/C编程指南》的笔试题。一.【预处理详解】①预定义符号②#define2.1 #define 定义标识符注意2.2 #define 定义宏注意警告提示2.3 #define 替换规则注意③ #和##3.1 #的作用3.2 ## 的作用④带副作用的宏参数⑤宏和函数对比5.1命名约定⑥#undef⑦命令行定义⑧条件编译⑨文件包含9.1 头文件被包含的方式 与 注意9.2 嵌套文件包含二. 【百度笔试题】Ⅰ.offsetof宏的实现Ⅱ 交换奇偶位三.【《高质量C/C编程指南》笔试题】Ⅰ.头文件中的 ifndef/define/endif是干什么用的?Ⅱ. #include filename.h 和 #include filename.h有什么区别?一.【预处理详解】 ①预定义符号 FILE //进行编译的源文件 LINE //文件当前的行号 DATE //文件被编译的日期 TIME //文件被编译的时间 STDC //如果编译器遵循ANSI C其值为1否则未定义 这些预定义符号都是语言内置的。 举个例子 printf(file:%s line:%d\n, __FILE__, __LINE__);②#define 2.1 #define 定义标识符 语法 #define name stuff 举个例子 #define MAX 1000 #define reg register //为 register这个关键字创建一个简短的名字 #define do_forever for(;;) //用更形象的符号来替换一种实现 #define CASE break;case //在写case语句的时候自动把 break写上。 // 如果定义的 stuff过长可以分成几行写除了最后一行外每行的后面都加一个反斜杠(续行符)。 #define DEBUG_PRINT printf(file:%s\tline:%d\t \date:%s\ttime:%s\n ,\ __FILE__,__LINE__ , \ __DATE__,__TIME__ ) 注意 在define定义标识符的时候要不要在最后加上 ; ? 比如 #define MAX 20; #define MAX 20建议不要加上 ; ,这样容易导致问题。 比如下面的场景 if(condition)max MAX;//MAX直接替换成20 那就有两个 elsemax 0;这里会出现语法错误 2.2 #define 定义宏 #define 机制包括了一个规定允许把参数替换到文本中这种实现通常称为宏macro或定义 宏define macro。 下面是宏的申明方式 #define name( parament-list ) stuff 其中的 parament-list 是一个由逗号隔开的符号表它们可能出现在stuff中。 注意 参数列表的左括号必须与name紧邻。 如果两者之间有任何空白存在参数列表就会被解释为stuff的一部分。 如 #define SQUARE( x ) x * x正确写法#define SQUARE(x) x * x 这个宏接收一个参数 x . 如果在上述声明之后你把SQUARE( 5 ); 置于程序中预处理器就会用下面这个表达式替换上面的表达式5 * 5 警告 这个宏存在一个问题 观察下面的代码段 int b 6; printf(%d\n ,SQUARE( b 1) ); 乍一看你可能觉得这段代码将打印49这个值。 事实上它将打印13. 为什么 替换文本时参数x被替换成b 1,所以这条语句实际上变成了 printf (“%d\n”,b 1 * b 1 ); 这样就比较清晰了由替换产生的表达式并没有按照预想的次序进行求值。 在宏定义上加上两个括号这个问题便轻松的解决了 #define SQUARE(x) (x) * (x)这样预处理之后就产生了预期的效果 #define SQUARE(x) (b1) * (b1) 也就是 #define SQUARE(x) (61) * (61)这里还有一个宏定义 #define DOUBLE(x) (x) (x)定义中我们使用了括号想避免之前的问题但是这个宏可能会出现新的错误。 int b 1; printf(%d\n ,10 * DOUBLE(b));这将打印什么值呢 warning 看上去好像打印20但事实上打印的是11. 我们发现替换之后 printf (%d\n,10 * (1) (1));乘法运算先于宏定义的加法所以出现了 11. 这个问题的解决办法是在宏定义表达式两边加上一对括号就可以了: #define DOUBLE(x) ( ( x ) ( x ) )提示 所以用于对数值表达式进行求值的宏定义都应该用这种方式加上括号避免在使用宏时由于参数中的操作符或邻近操作符之间不可预料的相互作用 2.3 #define 替换规则 在程序中扩展#define定义符号和宏时需要涉及几个步骤。 在调用宏时首先对参数进行检查看看是否包含任何由#define定义的符号。如果是它们首先 被替换。替换文本随后被插入到程序中原来文本的位置。对于宏参数名被他们的值替换。最后再次对结果文件进行扫描看看它是否包含任何由#define定义的符号。如果是就重复上 述处理过程。 注意 宏参数和#define 定义中可以出现其他#define定义的变量。但是对于宏不能出现递归。当预处理器搜索#define定义的符号的时候字符串常量的内容并不被搜索。 ③ #和## 如何把参数插入到字符串中 首先我们看看这样的代码 char* p hello xiao tao\n; printf(hello, xiao tao\n); printf(%s, p);我们发现答案是 我们发现字符串是有自动连接的特点的。 所以那我们是不是可以写这样的代码 #define PRINT(FORMAT, VALUE) printf(the value is FORMAT\n, VALUE); int main() {PRINT(%d, 10);return 0;}这里只有当字符串作为宏参数的时候才可以把字符串放在字符串中。 另外一个技巧是 3.1 #的作用 使用 # 把一个宏参数变成对应的字符串 比如 #define PRINT(FORMAT, VALUE) printf(the value of #VALUE is FORMAT\n, VALUE); int main() {int i 20;PRINT(%d, i 5);//产生了什么效果return 0; 代码中的 #VALUE 会预处理器处理为 “VALUE” . 所以最终的输出的结果应该是the value of i3 is 13 3.2 ## 的作用 ##可以把位于它两边的符号合成一个符号。 它允许宏定义从分离的文本片段创建标识符。 例如 #define ADD_TO_SUM(num, value) sum##num value; int main() {int sum5 0;//sum5初始化为0ADD_TO_SUM(5, 10);//作用是给sum5增加10.//sum##num value;--- sum510;return 0; } 注意 这样的连接必须产生一个合法的标识符。否则其结果就是未定义的。 ④带副作用的宏参数 当宏参数在宏的定义中出现超过一次的时候如果参数带有副作用那么你在使用这个宏的时候就可能 出现危险导致不可预测的后果。副作用就是表达式求值的时候出现的永久性效果。 例如 a1;//不带副作用 a;//带有副作用MAX宏可以证明具有副作用的参数所引起的问题。 #define MAX(a, b) ( (a) (b) ? (a) : (b) ) int main() {int x 4;int y 3;int z MAX(x, y);printf(x%d y%d z%d\n, x, y, z);//输出的结果是什么return 0; } 这里我们得知道预处理器处理之后的结果是什么 z ( (x) (y) ? (x) : (y));所以输出的结果是 x6; y4; z5; 解析 ⑤宏和函数对比 宏通常被应用于执行简单的运算。比如在两个数中找出较大的一个。 #define MAX(a, b) ((a)(b)?(a):(b))那为什么不用函数来完成这个任务 原因有二 用于调用函数和从函数返回的代码可能比实际执行这个小型计算工作所需要的时间更多。所以宏比 函数在程序的规模和速度方面更胜一筹。更为重要的是函数的参数必须声明为特定的类型。所以函数只能在类型合适的表达式上使用。反之 这个宏怎可以适用于整形、长整型、浮点型等可以用于来比较的类型。宏是类型无关的。 当然和宏相比函数也有劣势的地方每次使用宏的时候一份宏定义的代码将插入到程序中。除非宏比较短否则可能大幅度增加程序 的长度。宏是没法调试的。宏由于类型无关也就不够严谨。宏可能会带来运算符优先级的问题导致程容易出现错 宏有时候可以做函数做不到的事情。比如宏的参数可以出现类型但是函数做不到。 5.1命名约定 一般来讲函数的宏的使用语法很相似。所以语言本身没法帮我们区分二者。 那我们平时的一个习惯是 把宏名全部大写 函数名不要全部大写 ⑥#undef 这条指令用于移除一个宏定义。 #undef NAME //如果现存的一个名字需要被重新定义那么它的旧名字首先要被移除⑦命令行定义 许多C 的编译器提供了一种能力允许在命令行中定义符号。用于启动编译过程。 例如当我们根据同一个源文件要编译出不同的一个程序的不同版本的时候这个特性有点用处。假 定某个程序中声明了一个某个长度的数组如果机器内存有限我们需要一个很小的数组但是另外一 个机器内存大写我们需要一个数组能够大写。 #include stdio.h int main() {int array [ARRAY_SIZE];int i 0;for(i 0; i ARRAY_SIZE; i ){array[i] i;}for(i 0; i ARRAY_SIZE; i ){printf(%d ,array[i]);}printf(\n );return 0; }编译指令 gcc -D ARRAY_SIZE10 programe.c ⑧条件编译 在编译一个程序的时候我们如果要将一条语句一组语句编译或者放弃是很方便的。因为我们有条件编译指令。 1. #if 常量表达式//... #endif //常量表达式由预处理器求值。 如 #define __DEBUG__ 1 #if __DEBUG__//.. #endif 2.多个分支的条件编译 #if 常量表达式//... #elif 常量表达式//... #else//... #endif 3.判断是否被定义 #if defined(symbol) #ifdef symbol #if !defined(symbol) #ifndef symbol 4.嵌套指令 #if defined(OS_UNIX)#ifdef OPTION1unix_version_option1();#endif#ifdef OPTION2unix_version_option2();#endif #elif defined(OS_MSDOS)#ifdef OPTION2msdos_version_option2();#endif #endif⑨文件包含 我们已经知道 #include 指令可以使另外一个文件被编译。就像它实际出现于 #include 指令的地方 一样。 这种替换的方式很简单 预处理器先删除这条指令并用包含文件的内容替换。 这样一个源文件被包含10次那就实际被编译10次. 9.1 头文件被包含的方式 与 本地文件包含 #include filename查找策略 先在源文件所在目录下查找如果该头文件未找到编译器就像查找库函数头文件一样在标准位置查找头文件。 如果找不到就提示编译错误。 库文件包含 #include filename.h查找头文件直接去库函数下去查找如果找不到就提示编译错误。 注意 这样是不是可以说对于库文件也可以使用 “” 的形式包含 答案是:可以但没必要。 但是这样做查找的效率就低些当然这样也不容易区分是库文件还是本地文件了。 9.2 嵌套文件包含 当写一个项目时通常需要将各个功能分开分配给不同的程序猿写如果遇到下面的情况 也就是test程序中最终会出现两份common.h的内容这样就造成文件内容的重复。 如何解决这个问题 答案条件编译 每个头文件的开头写 #ifndef __TEST_H__//如果第一次没有定义这个文件 #define __TEST_H__//则定义一下。如果第二次出现了就不编译 //头文件的内容 #endif 或者 #pragma once就可以避免头文件的重复引入。 二. 【百度笔试题】 Ⅰ.offsetof宏的实现 介绍 我们首先要知道offsetof如何使用 #include stddef.h struct S {char c;int a;double f;}; int main() {printf(%d\n, offsetof(struct S,c));printf(%d\n, offsetof(struct S,a));printf(%d\n, offsetof(struct S,f));return 0; }思路 #define OFFSETOF(type,member) (int)(((type*)0)-member) //首先将0强制转换为结构体指针类型 //然后指向成员变量 //再取出成员的地址这个地址就是偏移量 struct S {char c;int a;double f;}; int main() {printf(%d\n, OFFSETOF(struct S,c));printf(%d\n, OFFSETOF(struct S,a));printf(%d\n, OFFSETOF(struct S,f));return 0; }Ⅱ 交换奇偶位 思路 1.整数有32个比特位也就是有16个奇数位16个偶数位要将奇数位偶数位全部交换。 2.我们可以将奇数位全部保留偶数位先不要。然后将奇数位向左移动1位。这样就把奇数位移动到偶数位了。 3.接着我们再将偶数位保留奇数位不要将偶数位向右移动1位这样就把偶数位移动到奇数位上了 4.最后两个相加就得到奇数位和偶数位交换的数了 如何保留奇数位呢去掉偶数位呢 奇数位上1偶数位上0 11111111111111111111111111111111 01010101010101010101010101010101 16进制表示0x55555555如何保留偶数位呢去掉奇数位呢 偶数位1奇数位0. 11111111111111111111111111111111 10101010101010101010101010101010 16进制表示0xaaaaaaaa#define SWAP(n) ((n0x55555555)1)((n0xaaaaaaaa)1) int main() {int n 10;printf(%d, SWAP(n));return 0; }结果 三.【《高质量C/C编程指南》笔试题】 Ⅰ.头文件中的 ifndef/define/endif是干什么用的? 防止嵌套文件包含 Ⅱ. #include filename.h 和 #include filename.h有什么区别? #include filename.h会直接到库函数所在的目录去查找头文件 #include filename.h会先在所在的文件目录去查找如果找不到再去库函数里找
文章转载自:
http://www.morning.dfndz.cn.gov.cn.dfndz.cn
http://www.morning.mcbqq.cn.gov.cn.mcbqq.cn
http://www.morning.jyjqh.cn.gov.cn.jyjqh.cn
http://www.morning.lmqfq.cn.gov.cn.lmqfq.cn
http://www.morning.wpkr.cn.gov.cn.wpkr.cn
http://www.morning.ykrss.cn.gov.cn.ykrss.cn
http://www.morning.lqynj.cn.gov.cn.lqynj.cn
http://www.morning.fykrm.cn.gov.cn.fykrm.cn
http://www.morning.glxmf.cn.gov.cn.glxmf.cn
http://www.morning.brxzt.cn.gov.cn.brxzt.cn
http://www.morning.rglzy.cn.gov.cn.rglzy.cn
http://www.morning.rblqk.cn.gov.cn.rblqk.cn
http://www.morning.gqnll.cn.gov.cn.gqnll.cn
http://www.morning.dkbsq.cn.gov.cn.dkbsq.cn
http://www.morning.xfrqf.cn.gov.cn.xfrqf.cn
http://www.morning.hmfxl.cn.gov.cn.hmfxl.cn
http://www.morning.cflxx.cn.gov.cn.cflxx.cn
http://www.morning.lswgs.cn.gov.cn.lswgs.cn
http://www.morning.jmmzt.cn.gov.cn.jmmzt.cn
http://www.morning.yckwt.cn.gov.cn.yckwt.cn
http://www.morning.rhkq.cn.gov.cn.rhkq.cn
http://www.morning.dgpxp.cn.gov.cn.dgpxp.cn
http://www.morning.qrwjb.cn.gov.cn.qrwjb.cn
http://www.morning.cmzgt.cn.gov.cn.cmzgt.cn
http://www.morning.xywfz.cn.gov.cn.xywfz.cn
http://www.morning.cndxl.cn.gov.cn.cndxl.cn
http://www.morning.smj79.cn.gov.cn.smj79.cn
http://www.morning.pnmtk.cn.gov.cn.pnmtk.cn
http://www.morning.zzbwjy.cn.gov.cn.zzbwjy.cn
http://www.morning.gfpyy.cn.gov.cn.gfpyy.cn
http://www.morning.ysgnb.cn.gov.cn.ysgnb.cn
http://www.morning.ccphj.cn.gov.cn.ccphj.cn
http://www.morning.qtqk.cn.gov.cn.qtqk.cn
http://www.morning.kdnbf.cn.gov.cn.kdnbf.cn
http://www.morning.kndyz.cn.gov.cn.kndyz.cn
http://www.morning.xqxlb.cn.gov.cn.xqxlb.cn
http://www.morning.zfcfk.cn.gov.cn.zfcfk.cn
http://www.morning.rddlz.cn.gov.cn.rddlz.cn
http://www.morning.lbcfj.cn.gov.cn.lbcfj.cn
http://www.morning.qxxj.cn.gov.cn.qxxj.cn
http://www.morning.bhmnp.cn.gov.cn.bhmnp.cn
http://www.morning.mmhaoma.com.gov.cn.mmhaoma.com
http://www.morning.fpzpb.cn.gov.cn.fpzpb.cn
http://www.morning.bnbtp.cn.gov.cn.bnbtp.cn
http://www.morning.ktqtf.cn.gov.cn.ktqtf.cn
http://www.morning.xqjz.cn.gov.cn.xqjz.cn
http://www.morning.kphsp.cn.gov.cn.kphsp.cn
http://www.morning.rfzzw.com.gov.cn.rfzzw.com
http://www.morning.pgjyc.cn.gov.cn.pgjyc.cn
http://www.morning.fdfdz.cn.gov.cn.fdfdz.cn
http://www.morning.ykmg.cn.gov.cn.ykmg.cn
http://www.morning.flhnd.cn.gov.cn.flhnd.cn
http://www.morning.kgnrh.cn.gov.cn.kgnrh.cn
http://www.morning.mywnk.cn.gov.cn.mywnk.cn
http://www.morning.cfnsn.cn.gov.cn.cfnsn.cn
http://www.morning.nrrzw.cn.gov.cn.nrrzw.cn
http://www.morning.rrgqq.cn.gov.cn.rrgqq.cn
http://www.morning.clkyw.cn.gov.cn.clkyw.cn
http://www.morning.dwyyf.cn.gov.cn.dwyyf.cn
http://www.morning.gtylt.cn.gov.cn.gtylt.cn
http://www.morning.dtfgr.cn.gov.cn.dtfgr.cn
http://www.morning.qdrrh.cn.gov.cn.qdrrh.cn
http://www.morning.kfhm.cn.gov.cn.kfhm.cn
http://www.morning.ztrht.cn.gov.cn.ztrht.cn
http://www.morning.bwdnx.cn.gov.cn.bwdnx.cn
http://www.morning.bphqd.cn.gov.cn.bphqd.cn
http://www.morning.qinhuangdjy.cn.gov.cn.qinhuangdjy.cn
http://www.morning.sfnjr.cn.gov.cn.sfnjr.cn
http://www.morning.prhqn.cn.gov.cn.prhqn.cn
http://www.morning.bbtn.cn.gov.cn.bbtn.cn
http://www.morning.mnnxt.cn.gov.cn.mnnxt.cn
http://www.morning.ljdjn.cn.gov.cn.ljdjn.cn
http://www.morning.mtgnd.cn.gov.cn.mtgnd.cn
http://www.morning.geledi.com.gov.cn.geledi.com
http://www.morning.ljdtn.cn.gov.cn.ljdtn.cn
http://www.morning.jwcmq.cn.gov.cn.jwcmq.cn
http://www.morning.lqytk.cn.gov.cn.lqytk.cn
http://www.morning.bqdpy.cn.gov.cn.bqdpy.cn
http://www.morning.hlnrj.cn.gov.cn.hlnrj.cn
http://www.morning.fbtgp.cn.gov.cn.fbtgp.cn
http://www.tj-hxxt.cn/news/246249.html

相关文章:

  • 上海网站建设电色盲能治好吗
  • 所有爱做网站wordpress投稿页面路径怎么写
  • 怎样建立微网站直播app在线看片有哪些
  • skype在网站上怎么做链接32岁学做网站
  • 怀化网站优化加徽信xiala5效果好做网站常规语言
  • 公司建设网站流程钓鱼网站后台是怎么做的
  • 网站前端是做网站吗wordpress 多站点 主站点
  • 注册公司网站的步骤前端开发招聘信息
  • 营销型网站建设教程视频教程中国最大的免费素材网站
  • 2008 做网站大庆门户网站
  • 文本分析网站让wordpress自检
  • 移动网站建设平台html电影网站源码
  • 用PS怎么做网站界面泸县建设局网站
  • 上海亿网站建设长沙网站制作哪家强
  • 北京网站设计外包公司网站交易模块怎么做
  • 哈尔滨网站设计有哪些步骤wordpress主体公园
  • 梭子手做鱼网站深圳专业做网站专业公司
  • 接工程网站深圳彩页设计
  • 长沙网站制作教程自媒体平台注册官网下载
  • 东莞网站设计效果阿里巴巴logo发展史
  • 凡科网站建设步骤简单的网页制作素材
  • 关于计算机网站建设的论文灌南县建设局网站
  • 品牌网站定制动易网站 价格
  • 如何建设与维护网站如何用asp做视频网站
  • 科技网站新版网站上线做网站一天赚多少钱
  • 青岛做网站企业排名网站的竞争对手
  • 如何把购物网站做成非经营网站云南省建设厅网站职称评审
  • 厦门网盛网站开发制作app的软件手机版
  • 重庆定制网站开发广东省建设教育协会是什么网站
  • 伍佰亿是什么网站我要自学网做网站