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

网站建设需求调研计划表建设单位网站需求报告

网站建设需求调研计划表,建设单位网站需求报告,wordpress ajax 提交评论,有个专门做dnf游戏币的网站c语言虽说经常和c在一起被大家提起#xff0c;但可千万不要以为它们是一个东西。现在我们常用的C语言是C89标准#xff0c;C是C99标准的。C89就是在1989年制定的标准#xff0c;如今最新的是C11和C11标准。根据不同的标准#xff0c;它们的功能也会有所不同#xff0c;但是…c语言虽说经常和c在一起被大家提起但可千万不要以为它们是一个东西。现在我们常用的C语言是C89标准C是C99标准的。C89就是在1989年制定的标准如今最新的是C11和C11标准。根据不同的标准它们的功能也会有所不同但是越新的版本支持的编译器越少所以本文在讨论的时候使用的C语言标准是C89C标准是C99.我们来介绍C语言和C中那些不同的地方。 1.函数默认值 在C中我们在定义或声明一个函数的时候有时会在形参中给它赋一个初始值作为不传参数时候的缺省值例如 int FUNint a 10 代表没有传参调用的时候自动给a赋一个10的初始值。然而这种操作在c89下是行不通的在c语言下这么写就会报错。 我们都知道系统在调用任何一个函数的时候都有函数栈帧的开辟如果函数有参数则需要压入实参。平常在我们人为给定实参的时候是按照参数列表从右向左依次将参数通过 mov  eax/ecx   dword ptr[ebp-4]       //假设是int数据 指令传入寄存器再通过push指令压入。现在我们已经给定了函数参数的默认值那么在压实参的时候只需要一步push初始值即可。效率更高。 另外需要注意的是赋初始值必须从参数列表的右边开始赋值从左边开始赋值将会出错 int sum1(int a 10,int b);        //错误int sum2(int a,int b 20);            //正确 因为如果sum1的声明是正确的那么我们调用的时候怎么调用sum1( ,20)很可惜这样属于语法错误调用这么写既然不对那就当然不能这样赋初始值了。相反sum2的调用sum2(20)合情合理没有任何问题。 实际在写工程的时候我们都习惯将函数的声明写在头文件中而非本文件里然后在不同的文件中写出它们的定义。那么这种情况可以赋初始值吗当然可以不论是定义还是声明处只要你遵守从右向左赋的规则就可以。甚至你还可以这样给初始值 int  fun(int a ,int b 10);int  fun(int a 20,int b); 眼尖的同学看见了下面的那行代码大喊错误因为先给左边赋值了 其实这样声明完全没有问题两句声明是同一个函数(函数多次声明没有问题)第一句已经给b了一个初始值运行到第二句时已经等价于int fun(int a 20,int b 10);了。但是注意这两句的顺序不能反转否则就是错误的。 总结C89标准的C语言不支持函数默认值C支持函数默认值且需要遵循从右向左赋初始值。 2.inline内联函数 说到内联函数大家应当不陌生它又是一个C89标准下C语言没有的函数。它的具体做法和宏非常相似也是在调用处直接将代码展开只不过宏它是在预编译阶段展开而内联函数是在 编译阶段进行处理的。同时宏作为预处理并不进行类型检查而inline函数是要进行类型检查的也就可以称作“更安全的宏”。 内联函数和普通函数的区别内联函数没有栈帧的开辟回退一般我们直接把内联函数写在头文件中include之后就可以使用由于调用时直接代码展开所以我们根本不需要担心什么重定义的问题——它连符号都没有生成当然不会所谓重定义了。普通函数生成符号内联函数不会生成符号。 关于inline还需要注意的一点是我们在使用它的时候往往是用来替换函数体非常小1~5行代码的函数的。这种情况下函数的堆栈开销相对函数体大小来说就非常大了这种情况使用内联函数可以大大提高效率。相反如果是一个需要很多代码才能实现的函数则不适合使用。一是此时函数堆栈调用开销与函数体相比已经是微不足道了二是大量的代码直接展开的话会给调试带来很大的不便。三是如果代码体达到一个阈值编译器会将它变成普通函数。 同时递归函数不能声明为inline函数。说到底inline只是对编译器的建议最终能否成功也不一定。同时我们平常生成的都是debug版本在这个版本下inline是不起作用的。只有生成release版时才会起作用。 总结C89没有在调用点直接展开不生成符号没有栈帧的开辟回退仅在Release版本下生效。一般写在头文件中。 3.函数重载 C语言中产生函数符号的规则是根据名称产生这也就注定了c语言不存在函数重载的概念。而C生成函数符号则考虑了函数名、参数个数、参数类型。需要注意的是函数的返回值并不能作为函数重载的依据也就是说int sum和double sum这两个函数是不能构成重载的 我们的函数重载也属于多态的一种这就是所谓的静多态。 静多态函数重载函数模板 动多态运行时的多态继承中的多态虚函数。 使用重载的时候需要注意作作用域问题请看如下代码。 #include iostream using namespace std; bool compare(int a,int b){    return a b;} bool  compare(double a,double b){    return a b;} int main(){    //bool compare(int a,int b);    compare(10,20);    compare(10.5,20.5);    return 0;} 我在全局作用域定义了两个函数它们由于参数类型不同可以构成重载此时main函数中调用则可以正确的调用到各自的函数。 但是请看main函数中被注释掉的一句代码。如果我将它放出来则会提出警告将double类型转换成int类型可能会丢失数据。 这就意味着我们编译器针对下面两句调用都调用了参数类型int的compare。由此可见编译器调用函数时优先在局部作用域搜索若搜索成功则全部按照该函数的标准调用。若未搜索到才在全局作用域进行搜索。 总结C语言不存在函数重载C根据函数名参数个数参数类型判断重载属于静多态必须同一作用域下才叫重载。 4.const 这一部分非常重要。在我的另一篇博客“C语言的32个关键字”中对C语言中的const也有所讲解。当中提到了这么一个问题C语言中被const修饰的变量不是常量叫做常变量或者只读变量这个常变量是无法当作数组下标的。然而在C中const修饰的变量可以当作数组下标使用成为了真正的常量。这就是C对const的扩展。 C语言中的const被修饰后不能做左值可以不初始化但是之后没有机会再初始化。不可以当数组的下标可以通过指针修改。简单来说它和普通变量的区别只是不能做左值而已。其他地方都是一样的。 C中的const真正的常量。定义的时候必须初始化可以用作数组的下标。const在C中的编译规则是替换和宏很像所以它被看作是真正的常量。也可以通过指针修改。需要注意的是C的指针有可能退化成C语言的指针。比如以下情况 int b 20;const int a b; 这时候的a就只是一个普通的C语言的const常变量了已经无法当数组的下标了。引用了一个编译阶段不确定的值 const在生成符号时是local符号。即在本文件中才可见。如果非要在别的文件中使用它的话在文件头部声明extern cosnt int data 10这样生成的符号就是global符号。 总结C中的const叫只读变量只是无法做左值的变量C中的const是真正的常量但也有可能退化成c语言的常量默认生成local符号。 5.引用 说到引用我们第一反应就是想到了他的兄弟指针。引用从底层来说和指针就是同一个东西但是在编译器中它的特性和指针完全不同。 int a 10;    int b a;    int *p a;     //b 20;    //*p 20; 首先定义一个变量a 10然后我们分别定义一个引用b以及一个指针p指向a。我们来转到反汇编看看底层的实现 可以看到底层实现完全一致取a的地址放入eax寄存器再将eax中的值存入引用b/指针p的内存中。至此我们可以说在底层引用本质就是一个指针。 了解了底层实现我们回到编译器。我们看到对a的值的修改指针p的做法是*p 20即进行解引用后替换值。底层实现 再来看看引用修改 我们看到修改a的值的方法也是一样的也是解引用。只是我们在调用的时候有所不同调用p时需要*p解引用b则直接使用就可以。由此我们 推断出引用在直接使用时是指针解引用。p直接使用则是它自己的地址。 这样我们也了解了我们给引用开辟的这块内存是根本访问不到的。如果直接用就直接解引用了。即使打印b输出的也是a的地址。 在此附上将指针转为引用的小技巧int *p a,我们将 引用符号移到左边 将 *替换即可int p a。 接下来看看如何创建数组的引用 int array[10] {0}       //定义一个数组 我们知道array拿出来使用的话就是数组array的首元素地址。即是int *类型。 那么array是什么意思呢int **类型用来指向array[0]地址的一个地址吗不要想当然了array是整个数组类型。 那么要定义一个数组引用按照上面的小诀窍先来写写数组指针吧 int (*q) [10] array; 将右侧的对左边的*进行覆盖 int (q)[10] array; 测试sizeof(q) 10。我们成功创建了数组引用。 经过上面的详解 我们知道了引用其实就是取地址。那么我们都知道一个立即数是没有地址的即 int b 10; 这样的代码是无法通过编译的。那如果你就是非要引用一个立即数其实也不是没有办法 const int b   10 即将这个立即数用const修饰一下就可以了。为什么呢 这时因为被const修饰的都会产生一个临时量来保存这个数据自然就有地址可取了。 总结引用底层就是指针使用时会直接解引用可以配合const对一个立即数进行引用。 6.malloc,free new,delete 这个问题很有意思也是重点需要关注的问题。malloc()和free()是C语言中动态申请内存和释放内存的标准库中的函数。而new和delete是C运算符、关键字。new和delete底层其实还是调用了malloc和free。它们之间的区别有以下几个方面 ①malloc和free是函数new和delete是运算符。 ②malloc在分配内存前需要大小new不需要。 例如int *p1 (int *)malloc(sizeof(int)); int *p2 new int;     //int *p3 new int(10); malloc时需要指定大小还需要类型转换。new时不需要指定大小因为它可以从给出的类型判断并且还可以同时赋初始值。 ③malloc不安全需要手动类型转换new不需要类型转换。 详见上一条。 ④free只释放空间delete先调用析构函数再释放空间如果需要。 与第⑤条对应如果使用了复杂类型先析构再call operator delete回收内存。 ⑤new是先调用构造函数再申请空间如果需要。 与第④条对应我们在调用new的时候例如int *p2 new int;这句代码 底层代码的实现是首先push 4字节int类型的大小随后call   operator new函数分配了内存。由于我们这句代码并未涉及到复杂类型如类类型所以也就没有构造函数的调用。如下是operator new的源代码也是new实现的重要函数 void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)        {       // try to allocate size bytes        void *p;        while ((p malloc(size)) 0)                if (_callnewh(size) 0)                {       // report no memory                        _THROW_NCEE(_XSTD bad_alloc, );                }         return (p);        } 我们可以看到首先malloc(size)申请参数字节大小的内存如果失败(malloc失败返回0)则进入判断如果_callnewh(size)也失败的话抛出bad_alloc异常。_callnewh()这个函数是在查看new handler是否可用如果可用会释放一部分内存再返回到malloc处继续申请如果new handler不可用就会抛出异常。 ⑥内存不足开辟失败时处理方式不同。 malloc失败返回0new失败抛出bad_alloc异常。 ⑦new和malloc开辟内存的位置不同。 malloc开辟在堆区new开辟在自由存储区域。 ⑧new可以调用malloc(),但malloc不能调用new。 new就是用malloc()实现的new是C独有malloc当然无法调用。 7.作用域 C语言中作用域只有两个局部全局。C中则是有局部作用域类作用域名字空间作用域三种。 所谓名字空间就是namespace我们定义一个名字空间就是定义一个新作用域。访问时需要以如下方式访问以std为例 std::cin 123 std::endl; 例如我们有一个名字空间叫Myname其中有一个变量叫做data。如果我们希望在其他地方使用data的话需要在文件头声明using Myname::data这样一来data就使用的是Myname中的值了。可是这样每个符号我们都得声明岂不是累死 我们只要using namespace Myname就可以将其中所有符号导入了。 这也就是我们经常看到的using namespace std;的意思啦。 ———————————————— 版权声明本文为CSDN博主「绘夜」的原创文章遵循 CC 4.0 BY-SA 版权协议转载请附上原文出处链接及本声明。 原文链接https://blog.csdn.net/czc1997/article/details/81254971
http://www.yutouwan.com/news/149451/

相关文章:

  • 合肥建站公司排名前十名欧模网室内设计网官网
  • 网站域名出售网站建设如何控标
  • 建筑公司网站管理员招标网官网下载
  • 旅游业网站建设网站开发毕设参考文献
  • 网站建设规划书300字wordpress网站设计
  • 网站需要备案才能建设吗asp漂亮的办公家具公司网站源码
  • 生物医药基地网站建设重庆购物狂论坛
  • 纯静态网站做优化有什么影响绍兴住房和城乡建设厅网站
  • 企业网站上的二维码怎么获得宁化县建设局网站
  • 亚当学院网站视频建设教程视频模板在线制作网站
  • 网站外部外链建设全国免费发布信息网站大全
  • 网站制作知识济南地铁建设
  • 备案网站用户名是什么wordpress 首页 修改
  • 嵩明县住房和城乡建设局网站e时代网站制作
  • 外贸网站设计与推广无锡小程序开发工作室
  • 徐州市铜山新区建设局网站沈阳网站制作全过程
  • 网站集约化建设的建议数字营销公司排行榜
  • 男女做那个那个的视频网站wordpress php文件上传
  • 网站建设发帖论坛社区wordpress 默认字体
  • 百度关键词优化系统企业网站优化之如何做需求分析
  • 美食网站建设设计方案手机兼职项目
  • 网站须知网站更换备案
  • 盐城seo网站优化软件望城经开区建设开发公司门户网站
  • 自己怎么建个网站wordpress 解释符号
  • 厦门微信商城网站建设神马seo排名关键词点击
  • 滁州 来安县建设局网站网络服务公司
  • 微网站与微信网站网站建设项目进展情况汇报
  • 免费建站建设网站国外采购平台有哪些
  • 企业网站seo手机兰州网站建设cheng
  • 做外链网站装修公司走心文案