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

怎么在别人网站上做锚文本链接订阅号可以做微网站

怎么在别人网站上做锚文本链接,订阅号可以做微网站,新葡京网址网站建设,做网站和做商城的区别在哪里文章目录 前言一、函数重载概念与使用C为何支持函数重载#xff1f; 二、引用概念语法特性权限(常引用)使用场景与指针的区别 三、内联函数四、auto关键字(C11)五、基于范围的for循环(C11)六、指针空值nullptr(C11)总结 前言 承前启后#xff0c;正文开始#xff01; 一、函… 文章目录 前言一、函数重载概念与使用C为何支持函数重载 二、引用概念语法特性权限(常引用)使用场景与指针的区别 三、内联函数四、auto关键字(C11)五、基于范围的for循环(C11)六、指针空值nullptr(C11)总结 前言 承前启后正文开始 一、函数重载 概念与使用 函数重载是函数的一种特殊情况C允许在同一作用域中声明几个功能类似的同名函数,常用来处理实现功能类似数据类型不同的问题而C语言不允许同名函数   但是需要满足的条件是函数的形参列表不同即参数个数类型类型顺序不同 在C语言中我们如果要实现两数之和 Add 函数如果需要int、double两种各一个我们可能会命名为Addi、Addd这很麻烦而函数重载就可以解决这个问题下面让我们来看具体实现代码 #includeiostream using namespace std;// 1、参数类型不同 int Add(int x, int y) {return x y; } double Add(double x, double y) {return x y; }// 2、参数个数不同 void f() {cout f() endl; } void f(int a) {cout f(a) endl; }// 3、参数类型顺序不同(本质还是参数类型不同) void f(int a, char b) {cout f(int a,char b) endl; } void f(char b, int a) {cout f(char b, int a) endl; }int main() {// 都可以对应到正确的函数Add(10, 20); Add(10.1, 20.2); f();f(10);f(10, a);f(a, 10);return 0; }另外你需要注意只有返回类型不同不构成重载原因会产生歧义具体看以下代码 #include iostream using namespace std;void f() {cout void f() endl; } int f() {cout int f() endl;return 0; }int main() {f(); // 调用哪一个不确定return 0; }C为何支持函数重载 这里我们就需要回想前面学习C的时候有关预处理和编译的内容了   在C/C程序运行之前需要进行以下几个阶段: 预处理、编译、汇编、链接 关于链接你可以尝试回想以下 我们知道在编译阶段会将程序中的每个源文件的全局范围的变量符号分别进行汇总。在汇编阶段会给每个源文件汇总出来的符号分配一个地址若符号只是一个声明则给其分配一个无意义的地址然后分别生成一个符号表。最后在链接期间会将每个源文件的符号表进行合并若不同源文件的符号表中出现了相同的符号则取合法的地址为合并后的地址重定位) 举个例子我们观看下面两个同根.c文件内容 // sum.cint sum(int num1, int num2){return num1 num2;}// main.cextern int sum(int num1, int num2);int main(){sum(1,2);return 0;}注意在链接前两个.c文件都是单线不交互的这时候sum.c里面的sum函数有定义而main.c里面的sum函数没有定义等到两个.c文件经过汇编后main.o形成如下符号表 main 0x100 sum 0x000 (无意义的地址) sum.o形成以下符号表 sum 0x800 (有意义的地址) 接着两个文件合成一个文件错误的sum地址被改为正确的地址而你想假如有两个sum函数被定义即有地址那么它们单独来看都是有意义的地址可是这时候要重定位哪个哪怕只有一个文件两个重名函数那么你call的是哪个函数这很明显有歧义 来验证一下吧首先我们在Linux环境下采用gcc编译器 可以看到Add就是Addfunc就是func没有半点修饰 接着我们再在Linux环境下采用g编译器来编译 多试几个函数其实你会发现修饰函数名字在此环境下的规律为 { _Z 函数名长度 函数名 类型首字母 } 也就是说C在进行符号汇总时对函数的名字修饰做了改动函数汇总出的符号不再单单是函数的函数名而是通过其参数的类型和个数以及顺序等信息汇总出一个名字这样一来就算是函数名相同的函数只要其参数的类型或参数的个数或参数的顺序不同那么汇总出来的符号也就不同了其实也从侧面说明了函数重载跟返回类型没关系 这可能很抽象毕竟有关编译甚至在大学还有专门的一门专业课《编译原理》大家如有困惑可以自行查阅其他相关资料 二、引用 概念 引用不是定义一个变量而是已存在的变量取了一个别名编译器不会为引用变量开辟内存空间它和它引用的变量共用同一块内存空间 “李逵”、“铁牛”、“黑旋风”本质上都是一个人 语法 类型说明符 引用对象名 引用实体引用类型必须和引用实体是同种类型 来个具体例子 void TestPef() {int a 10;int pa a; // pa是a的别名// 从地址上可以得出它和它引用的变量共用同一块内存空间printf(a %p\n, a);printf(pa %p\n, pa); }输出结果如下 特性 引用在定义时必须初始化 int a 10; int b a; // right一个变量可以有多个引用 int a 10; int b a; // right int c a; // right int d a; // right引用一旦引用了一个实体就不能再引用其他实体 int a 10;int b a;int c 20;b c; //你的想法让b转而引用c其实是c赋值给b权限(常引用) 我们知道权限可以缩小或者平移但是绝对不能放大 void TestConstRef() {int a0;int ba;const int ca; //支持-权限缩小const int x10;int yx;//不支持-权限放大此时的x只有读权限没有写权限const int yx;//支持权限相等//表达式的返回值是临时对象而临时对象具有常性!!int n ax 临时对象 //这里是属于权限放大const int n ax 临时对象; //支持权限相等使用场景 用作形参因为是同一块内存空间所以在一定程度上可以替代指针 //交换函数 void Swap(int a, int b) {int tmp a;a b;b tmp; }不用创建临时变量提高效率 #include ctime #include iostream using namespace std;struct A { int a[10000]; };void TestFunc1(struct A a) {} void TestFunc2(struct A a) {}int main() {A a;size_t begin1 clock();for (int i 0; i 10000; i)TestFunc1(a);size_t end1 clock();size_t begin2 clock();for (int i 0; i 10000; i)TestFunc2(a);size_t end2 clock();// 在某次错误时cout TestFunc1(struct A a): end1 - begin1 endl; // 0cout TestFunc1(struct A a): end2 - begin2 endl; // 5return 0; }与指针的区别 其实引用不可像指针那样更改注定了无法完全替代指针像链表我们就必须用到指针 在语法概念上引用是一个别名没有独立空间同其引用实体共用同一块空间但是在底层实现上实际引用是有开辟空间的由于引用是按照指针方式实现的 总而言之你需要记住以下几点 1、引用在定义时必须初始化指针没有要求。 2、引用在初始化时引用一个实体后就不能再引用其他实体而指针可以在任何时候指向任何一个同类型实体。 3、没有NULL引用但有NULL指针。 4、在sizeof中的含义不同引用的结果为引用类型的大小但指针始终是地址空间所占字节个数32位平台下占4个字节。 5、引用进行自增操作就相当于实体增加1而指针进行自增操作是指针向后偏移一个类型的大小。 6、有多级指针但是没有多级引用。 7、访问实体的方式不同指针需要显示解引用而引用是编译器自己处理。 8、引用比指针使用起来相对更安全。 三、内联函数 在C语言中假设有一些小而频繁使用的函数如交换函数Swap大量使用会建立栈帧消耗时间宏是C语言给出的解决方式可这样太麻烦且易错 比如来个Add函数宏的正确写法是 #define Add(x, y) ((x) (y)) 基于此对于C来说以inline修饰的函数叫做内联函数编译时C编译器会在调用内联函数的地方展开没有函数压栈的开销内联函数的使用可以提升程序的运行效率 事实上C相当不鼓励使用宏理由有代码可读性差导致调试不方便、与函数相比没有类型检查宏做的仅仅是替换在有些场景下比较复杂需要谨慎替换后运算符的优先级等 而C给出的方案是 i 用const和enum替代宏常量 ii用inline内联函数替代宏函数 还是来个具体例子吧我们现在来观察调用普通函数和内联函数的汇编代码来进一步查看其优势 int Add(int a, int b) {return a b; } int main() {int ret Add(1, 2);return 0; }如果内联函数语句较多且多次不同地方调用可能会使编译后的文件可执行程序变大其实这本质上就是一种以空间换时间的做法但优点是减少了调用开销提高了程序运行效率 内联函数是对编译器的一个建议对于我们实现的内联函数编译器不一定执行不同编译器关于inline函数得实现机制可能不同一般情况下建议将函数规模较小不是递归且频繁调用的函数采用inline修饰否则编译器会忽略inline特性 inline函数不要让声明和定义分离分离会导致链接错误因为inline被展开就不再调用函数没有函数地址了链接就会找不到 四、auto关键字(C11) 随着学习的深入我们会发现1. 类型难于拼写 2. 含义不明确导致容易出错   auto在C11就因此被赋予了新的含义作为一个新的类型指示符来指示编译器auto声明的变量必须由编译器在编译时期推导而得 用auto声明指针类型时用auto和auto*没有任何区别但用auto声明引用类型时必须加 #include iostream using namespace std;int main() {int a 10;auto b a; // 自动推导出b的类型为int*auto* c a; // 自动推导出c的类型为int*auto d a; // 自动推导出d的类型为int// 打印变量b,c,d的类型cout typeid(b).name() endl;// 打印结果为int*cout typeid(c).name() endl;// 打印结果为int*cout typeid(d).name() endl;// 打印结果为intreturn 0; }在同一行定义多个变量必须是同一类型 int main() {auto a 1, b 2; // rightauto c 3, d 4.0; // err: “auto”必须始终推导为同一类型return 0; }auto不能作为函数的参数 void TestAuto(auto x) {} // errauto不能直接用来声明数组 int main() {int a[] { 1, 2, 3 };auto b[] { 4, 5, 6 };// errreturn 0; }五、基于范围的for循环(C11) C11中引入了基于范围的for循环。for循环后的括号由冒号分为两部分第一部分是范围内用于迭代的变量第二部分则表示被迭代的范围。 其实是抄的Python的作业 int arr[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };//将数组元素值全部乘以2for (auto e : arr) // 运用了引用{e * 2;}//打印数组中的所有元素for (auto e : arr){cout e ;}cout endl;范围for的使用是有条件的 一、for循环迭代的范围必须是确定的  对于数组而言就是数组中第一个元素和最后一个元素的范围对于类而言应该提供begin和end的方法begin和end就是for循环迭代的范围。 二、迭代的对象要实现和操作  这是关于迭代器的问题大家先了解一下。 六、指针空值nullptr(C11) 前人挖坑NULL其实是一个宏在传统的C头文件(stddef.h)中可以看到如下代码 /* Define NULL pointer value */ #ifndef NULL #ifdef __cplusplus #define NULL 0 // NULL 直接被替换为0 #else /* __cplusplus */ #define NULL ((void *)0) #endif /* __cplusplus */ #endif /* NULL */我们之前都拿NULL当指针空值而上述错误就可能导致以下BUG #include iostream using namespace std;void f(int) {cout f(int) endl; } void f(int*) {cout f(int*) endl; } int main() {f(0);f(NULL); // 我们想的是匹配第二个结果是第一个这就是错误的宏替换带来的后果f((int*)NULL);return 0; }所以对于C98中的问题C11引入了关键字nullptr 请注意 在使用nullptr表示指针空值时不需要包含头文件因为nullptr是C11作为关键字引入的在C11中sizeof(nullptr)与sizeof((void*)0)所占的字节数相同为了提高代码的健壮性在后序表示指针空值时建议最好使用nullptr 总结 本节干货好多函数重载原理的那一部分可能有些困难加油
http://www.w-s-a.com/news/424988/

相关文章:

  • 网站iis7.5配置免费网站建设模板下载
  • 生物公司网站建设方案wordpress自定义字段调用
  • 静态网站公用头部如何调用标题wordpress自动采集翻译插件怎么用
  • 网站做单链 好不好网站营销不同阶段的网站分析目标
  • 网线制作颜色顺序兰州网站推广优化
  • 北京沙河教做网站的企业融资以什么为基础
  • 给网站添加百度地图绵阳做绵阳做网站网站
  • 用电脑做服务器制作网站东莞营销网站建设
  • 网站需要怎么做wordpress 重装
  • 做电影网站赚钱的方法世界500强企业排名2023
  • 领卷网站怎么做的西宁设计网站建设
  • 东莞网站建设价位软件开发税率是13%还是6
  • 企业网站建设一条龙如何在网上推广自己
  • 成品网站制作公司企梦网站建设
  • 网站开发微信授权登录ftp 如何 更新 wordpress
  • icp备案和网站不符查询公司的网站备案
  • 万江营销型网站建设泰安网站建设制作电话号码
  • 做网站是用ps还是ai服饰东莞网站建设
  • 只做一页的网站多少钱网站开发就业趋势
  • 陈村网站建设有哪些网站可以做店面设计
  • 查询网站注册信息wordpress 照片墙
  • 成都网站设计服务商室内设计设计师网站推荐
  • 企业建站系统cms百度网址ip
  • wordpress 代码编辑插件下载搜索引擎优化seo课程总结
  • 韩都衣舍网站建设的改进邯郸公众号小程序制作
  • 上海设计网站建设在线视频制作
  • 东营高端网站建设新建网站如何让百度收录
  • wordpress怎么生成网站地图微网站平台怎样做网站
  • 同安区建设局网站招投标公众号简介有趣的文案
  • 江苏州 网站制作网上宣传方法有哪些