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

快速做网站的软件男女做恩爱视频网站

快速做网站的软件,男女做恩爱视频网站,官方网站建设合同,成立学校网站建设小组目录 1.内联函数 1.1 概念 1.2 特性 1.3 内联函数与宏的区别 2.auto关键字(C11) 2.1 auto简介 2.2 auto的使用细则 2.3 auto不能推导的场景 3.基于范围的for循环(C11) 3.1 范围for的语法 3.2 范围for的使用方法 4.指针空值nullptr(C11) 4.1 C98中的指针空值 1.内联…目录 1.内联函数 1.1 概念 1.2 特性 1.3 内联函数与宏的区别 2.auto关键字(C11) 2.1 auto简介 2.2 auto的使用细则 2.3 auto不能推导的场景 3.基于范围的for循环(C11) 3.1 范围for的语法 3.2 范围for的使用方法 4.指针空值nullptr(C11) 4.1 C98中的指针空值 1.内联函数 1.1 概念 以inline修饰的函数叫做内联函数编译时C编译器会在调用内联函数的地方展开没有函数调 用建立栈帧的开销内联函数提升程序运行的效率。 inline int Add(int left, int right) {return left right; }int main() {int ret 0;ret Add(1, 2);return 0; } 如果在上述函数前增加inline关键字将其改成内联函数在编译期间编译器会用函数体替换函数的 调用。 查看方式 在release模式下查看编译器生成的汇编代码中是否存在call Add而release模式下不能调试所以采用第二种方法。在debug模式下需要对编译器进行设置否则不会展开(因为debug模式下编译器默认不会对代码进行优化以下给出vs2022的设置方式 右键点击解决方案管理器中的项目名称打开属性设置下面两个选项。  发现没有使用调用函数指令call没有调用Add函数而是直接在这里展开了内联函数。 1.2 特性 inline是一种以空间换时间的做法如果编译器将函数当成内联函数处理在编译阶段会用函数体替换函数调用缺陷可能会使目标文件变大优势少了调用开销提高程序运行效率。inline对于编译器而言只是一个建议当不当做内联函数还需要编译器自己判断不同编译器对于inline实现机制可能不同一般建议将函数规模较小(即函数不是很长具体没有准确的说法取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰否则编译器会忽略inline特性。下图为《Cprime》第五版关于inline的建议inline不建议声明和定义分离分离会导致链接错误。因为内联函数在编译时展开如果只有声明就找不到只能通过函数调用但是符号表中没有内联函数因为内敛函数不生成指令不会进入符号表。内联函数推荐在头文件中定义。当然内联函数定义也可以放在源文件中但此时只有定义的那个源文件可以用它如果其他源文件使用必须拷贝一份定义。当然定义在头文件中包含头文件时编译器会帮你拷贝一份不用自己拷贝。关键字 inline 必须与函数定义体放在一起才能使函数成为内联仅将 inline 放在函数声明前面不起任何作用。声明前可以不用加 inline 1.3 内联函数与宏的区别 内联函数是在编译时展开编译器而宏在预编译时展开预处理在编译的时候内联函数直接被嵌入到目标代码中去而宏只是一个简单的文本替换。内联函数可以进行类型安全检查、自动类型转换、语句是否正确等编译功能宏不具有这样的功能。 宏在定义时要注意宏参数一般用括号括起来否则容易出现二义性。而内联函数不会出现二义性。.宏定义不是真正的函数没有参数类型检查不安全而内联函数是真正的函数有类型检查更为安全。 宏函数实现Add。 #includeiostream using namespace std; #define ADD(x,y) ((x)(y)) int main() {int a ADD(1, 2);//printf(%d\n, ADD(1, 2));宏不能带分号// #define ADD(x,y) xy//printf(%d\n, ADD(1, 2)*3);//不加括号变为12*3cout a endl;//#define ADD(x,y) (xy)int b 1, c 2;ADD(b | c, b c);//x和y不加括号xy) 会变为b|cbc,优先级比位操作符高return 0; } 【面试题】 宏的优缺点 优点 增强代码的复用性没有类型的严格限制。提高性能针对频繁调用的小函数不需要再建立栈帧。 缺点 不方便调试宏。因为预编译阶段进行了替换导致代码可读性差可维护性差容易误用。没有类型安全的检查。 C有哪些技术替代宏 1. 常量定义 换用const enum 2. 短小函数定义 换用内联函数 2.auto关键字(C11) 2.1 auto简介 在早期C/C中auto的含义是使用auto修饰的变量是具有自动存储器的局部变量。 在C11中标准委员会赋予了auto全新的含义即auto不再是一个存储类型指示符而是作为一个新的类型指示符来指示编译器auto声明的变量必须由编译器在编译时期推导而得。 int TestAuto() {return 10; }int main() {int a 10;//int b a;//auto 赋值时可以通过右边的值自动推导左边值的类型auto b a;auto c a;auto d TestAuto();cout typeid(b).name() endl;//可以得到变量的类型cout typeid(c).name() endl;cout typeid(d).name() endl;//auto e; 无法通过编译使用auto定义变量时必须对其进行初始化return 0; } 【注意】 使用auto定义变量时必须对其进行初始化在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此auto并非是一种“类型”的声明而是一个类型声明时的“占位符”编译器在编译期会将auto替换为变量实际的类型。 有什么用处呢? 随着程序越来越复杂程序中用到的类型也越来越复杂经常体现在 类型难于拼写含义不明确导致容易出错 比如我们C以后要学习的std::mapstd::string, std::string::iterator 是一个类型但是该类型太长了特别容易写错。这时可以使用auto自动推导类型。 int main() {//普通情况下没有价值//类型名很长就会有价值std::vectorstd::string v;//std::vectorstd::string::iterator it v.begin();auto it v.begin();return 0; } 2.2 auto的使用细则 1. auto与指针和引用结合起来使用 用auto声明指针类型时用auto和auto*没有任何区别但用auto声明引用类型时则必须加 int main() {int x 10;auto a x;auto* b x;//与上一行相同auto c x;cout typeid(a).name() endl;cout typeid(b).name() endl;cout typeid(c).name() endl;*a 20;*b 30;c 40;return 0; } 2. 在同一行定义多个变量 当在同一行声明多个变量时这些变量必须是相同的类型否则编译器将会报错因为编译器实际只对第一个类型进行推导然后用推导出来的类型定义其他变量。 void TestAuto() {auto a 1, b 2;auto c 3, d 4.0; // 该行代码会编译失败因为c和d的初始化表达式类型不同 } 2.3 auto不能推导的场景 1. auto不能作为函数的参数 // 此处代码编译失败auto不能作为形参类型因为编译器无法对a的实际类型进行推导 void TestAuto(auto a) {} 2. auto不能直接用来声明数组 void TestAuto() {int a[] {1,2,3};auto b[] {456};//编译失败 } 3. 为了避免与C98中的auto发生混淆C11只保留了auto作为类型指示符的用法 4. auto在实际中最常见的优势用法就是跟下面会讲到的C11提供的新式for循环还有后面会学的lambda表达式等进行配合使用   3.基于范围的for循环(C11) 3.1 范围for的语法 在C98中如果要遍历一个数组可以按照以下方式进行 void TestFor() {int array[] { 1, 2, 3, 4, 5 };for (int i 0; i sizeof(array) / sizeof(array[0]); i)array[i] * 2;for (int* p array; p array sizeof(array)/ sizeof(array[0]); p)cout *p endl; } 对于一个有范围的集合而言由程序员来说明循环的范围是多余的有时候还会容易犯错误。因 此C11中引入了基于范围的for循环。for循环后的括号由冒号“ ”分为两部分第一部分是范 围内用于迭代的变量第二部分则表示被迭代的范围。 void TestFor() {int array[] { 1, 2, 3, 4, 5 };for(auto e : array)//会依次取array中的元素赋值给ee * 2;//for(auto* e : array)//这种写法不对因为array中的元素类型是int类型// (*e) * 2; //不是一种地址这里会发生类型不匹配for(auto e : array)cout e ; } 注意与普通循环类似可以用continue来结束本次循环也可以用break来跳出整个循环。 3.2 范围for的使用方法 1. for循环迭代的范围必须是确定的 对于数组而言就是数组中第一个元素和最后一个元素的范围对于类而言应该提供begin和end的方法begin和end就是for循环迭代的范围。 注意以下代码就有问题因为for的范围不确定因为函数传参array这里只是地址不是代表一个数组。 void TestFor(int array[]) {for(auto e : array)cout e endl; } 2. 迭代的对象要实现和的操作。(关于迭代器这个问题以后会讲现在提一下没办法 讲清楚现在大家了解一下就可以了)   4.指针空值nullptr(C11) 4.1 C98中的指针空值 在良好的C/C编程习惯中声明一个变量时最好给该变量一个合适的初始值否则可能会出现 不可预料的错误比如未初始化的指针。如果一个指针没有合法的指向我们基本都是按照如下 方式对其进行初始化 void TestPtr() {int* p1 NULL;int* p2 0;// …… } NULL实际是一个宏在传统的C头文件(stddef.h)中可以看到如下代码 #ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endif 条件编译指令可以看到NULL可能被定义为字面常量0或者被定义为无类型指针(void*)的常量。不论采取何种定义在使用空值的指针时都不可避免的会遇到一些麻烦比如在函数重载中 void func(int)//参数类型匹配即可调用 {cout void f(int) endl; }void func(int*) {cout void fx(int*) endl; }int main() {func(0);func(NULL);//会调用第一个函数func((int*)NULL);//调用第二个//#define nullptr ((void*)0)func(nullptr);//nullptr类型是void*return 0; } 程序本意是想通过f(NULL)调用指针版本的f(int*)函数但是由于NULL被定义成0因此与程序的 初衷相悖。 在C98中字面常量0既可以是一个整形数字也可以是无类型的指针(void*)常量但是编译器 默认情况下将其看成是一个整形常量如果要将其按照指针方式来使用必须对其进行强转(void *)0。所以在(C11)引入了nullptr表示空指针。#define nullptr ((void*)0) 注意  在使用nullptr表示指针空值时不需要包含头文件因为nullptr是C11作为新关键字引入的。在C11中sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。 为了提高代码的健壮性在后续表示指针空值时建议最好使用nullptr 本篇结束。
http://www.w-s-a.com/news/287495/

相关文章:

  • 甘肃网站建设制作商网站空间哪家公司的好
  • 思途旅游网站建设系统用vscode做网站
  • 广州站改造最新消息半年工作总结ppt模板
  • logo模板下载网站推荐哪家网站开发培训好
  • 做外贸网站效果图页面关键词优化
  • 广平网站建设成都活动轨迹
  • 小型网站网站建设需要网络公司是什么行业
  • 滑动 手机网站 代码网页制作与设计讨论
  • 自己做网站处理图片用什么软件wordpress html5支持
  • 校园网站怎么建软文文案范文
  • 中国建设官方网站如何创建自己的软件
  • 来宾住房与城乡建设网站天津西青区怎么样
  • 西安网站建设培训班鄂州网页定制
  • 西部数码网站备份自己怎么做网站啊
  • h5网站开发用什么软件制作公司网站建设代理怎么做
  • 网站建设资料准备网上购物app有哪些
  • 沧州做网站优化哪家公司便宜国内百度云网站建设
  • 网站的最近浏览 怎么做龙岩市人才网最新招聘信息
  • 网站建设需要找工信部吗网站开发账务处理
  • 做那种的视频网站个体工商网站备案
  • 推广网官方推广网站中国建设招聘信息网站
  • 医院网站建设需要多少钱网络营销渠道可分为哪几种
  • 怎么取网页视频网站元素计算机专业论文网站开发
  • 上海网站建设备案号怎么恢复wordpress打开页面空白
  • 30个做设计的网站企业设计网站
  • 招生网站开发的背景创意 wordpress
  • 网站备案资料查询小型企业管理系统软件
  • 温州网站建设维护怎么做好网站开发、设计
  • 佛山 做网站公司有哪些网站排名忽然不见了
  • 广告网站建设最专业东莞大朗网站设计