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

福州网站设计网址现在进出深圳最新规定

福州网站设计网址,现在进出深圳最新规定,南京做网站哪家公司最好,网站制作公司怎么运营文章目录 前言1.C关键字2.命名空间3.C的输入输出4.缺省参数4.1 全缺省4.2 半缺省 5.函数重载6. 引用6.1 引用的特性6.2 引用的使用场景6.3 引用和指针 7.内联函数7.1 特性 8.auto关键字8.1 注意事项 9. 基于范围的for循环9.1 使用条件 10.指针控制nullptr10.1 注意事项 11.总结… 文章目录 前言1.C关键字2.命名空间3.C的输入输出4.缺省参数4.1 全缺省4.2 半缺省 5.函数重载6. 引用6.1 引用的特性6.2 引用的使用场景6.3 引用和指针 7.内联函数7.1 特性 8.auto关键字8.1 注意事项 9. 基于范围的for循环9.1 使用条件 10.指针控制nullptr10.1 注意事项 11.总结 前言 C语言是结构化和模块化的语言适合处理较小规模的程序。对于复杂的问题规模较大的程序需要高度的抽象和建模时C语言则不合适。为了解决软件危机 20世纪80年代 计算机界提出了OOP(object oriented programming面向对象)思想支持面向对象的程序设计语言应运而生。   1982年Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念发明了一种新的程序语言。为了表达该语言与C语言的渊源关系命名为C。因此C是基于C语言而产生的它既可以进行C语言的过程化程序设计又可以进行以抽象数据类型为特点的基于对象的程序设计还可以进行面向对象的程序设计。 阶段内容C with classes类及派生类、公有和私有成员、类的构造和析构、友元、内联函数、赋值运算符重载等C1.0添加虚函数概念函数和运算符重载引用、常量等C2.0更加完善支持面向对象新增保护成员、多重继承、对象的初始化、抽象类、静态成员以及const成员函数C3.0进一步完善引入模板解决多重继承产生的二义性问题和相应构造和析构的处理C98C标准第一个版本绝大多数编译器都支持得到了国际标准化组织(ISO)和美国标准化协会认可以模板方式重写C标准库引入了STL(标准模板库)C03C标准第二个版本语言特性无大改变主要修订错误、减少多异性C05C标准委员会发布了一份计数报告(Technical ReportTR1)正式更名C0x即计划在本世纪第一个10年的某个时间发布C11增加了许多特性使得C更像一种新语言比如正则表达式、基于范围for循环、auto关键字、新容器、列表初始化、标准线程库等C14对C11的扩展主要是修复C11中漏洞以及改进比如泛型的lambda表达式auto的返回值类型推导二进制字面常量等C17在C11上做了一些小幅改进增加了19个新特性比如static_assert()的文本信息可选Fold表达式用于可变的模板if和switch语句中的初始化器等C20自C11以来最大的发行版引入了许多新的特性比如模块(Modules)、协程(Coroutines)、范围(Ranges)、概念(Constraints)等重大特性还有对已有特性的更新比如Lambda支持模板、范围for支持初始化等C23制定ing 1.C关键字 这是C的所有关键字每一个都有特殊含义此处一个一个讲麻烦且不易理解因此等以后遇到了再具体讲解。 2.命名空间 在C/C中变量、函数和后面要学到的类都是大量存在的这些变量、函数和类的名称将都存在于全局作用域中可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化以避免命名冲突或名字污染namespace关键字的出现就是针对这种问题的。   举个例子比如在stdlib.h中有一个rand()函数是用来产生随机数的一个函数。   此时我们可以看到在还没有包stdlib.h头文件时是可以正常运行的那么我们再看看包头文件之后会发生什么。   我们发现竟然编译失败了这是因为在编译时会将头文件内的内容展开就会出现rand()函数与我们定义的全局变量 rand 一样的名字因此就会产生重定义因此 namespace 命名空间就随之产生了它的作用就是为了避免这种情况的发生。   命名空间就是用 namespace 关键字加上任意的名字和花括号即可。但是大家可以观察到在输出的那一行我写的是WY : : rand这个的意思就是输出 WY 命名空间中的 rand而不是使用头文件中的 rand。   命名空间就像一堵无形的墙将同名的变量分隔到了不同的空间你需要哪个空间的变量就去哪个空间去寻找。但是一个命名空间里又有同名的变量存在呢C开创者也早已想到了这个问题那就是在命名空间中还可以再开辟命名空间俗称套娃。   命名空间可以定义变量、函数以及类型。但是需要注意的是在定义结构体类型时在访问时是要在 struct 后面写的。同时同一个工程中是允许出现同名的命名空间的在编译时编译器会自动将其合并。 int rand 0;//全局变量 namespace WY {int rand 1;int Add(int a, int b){return a b;}struct Node{int data;int* next;}; } int main() {//域作用限定符printf(%d, rand);printf(%d, WY::rand);printf(%d, WY::Add(1,2));struct WY::Node node;return 0; }前面都还是用C语音来模拟一些环境那么C本身是什么样的呢C有自己专属的命名空间和头文件。 //C标准库的命名空间将标准库的定义与实现都放入了这个命名空间中 #includeiostream using namespace std; int main() {cout Wang You endl; }但是这样的写法就是将命名空间中的所有内容全部展开了是非常容易造成重定义问题的比如在你和其他人共同写一个项目时用到了同一个变量名字结果在最后一起运行时都将自己的命名空间全部展开那么岂不是还会出现重定义的情况吗因此这种写法在与他人共同合作时不可取但是在自己日常练习中还是可以的毕竟变量名都是由自己控制的可以避免这种情况。   同时展开也全部展开和部分展开比如 Add 函数需要经常使用就可以进行部分展开这样就不用在每次使用前都加域作用限定符 : : 了。 //全部展开 using namespace WY;//部分展开 using WY::Add;3.C的输入输出 在上面其实也写过一次请看 #includeiostream using namespace std; int main() {int a;cin a;cout Wang You endl;return 0; }cout是输出时使用的与C语言中的 printf 作用一致还有一个是 cin与 scanf 作用一致。 与C语言相比需要注意的是 在使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时必须包含 iostream 头文件以及按命名空间使用方法使用std。cout和cin是全局的流对象endl是特殊的C符号表示换行输出他们都包含在包含 iostream 头文件中。 是流插入运算符 是流提取运算符。使用C输入输出更方便不需要像printf/scanf输入输出时那样需要手动控制格式。C的输入输出可以自动识别变量类型。实际上cout和cin分别是ostream和istream类型的对象和也涉及运算符重载等知识这些知识后续将会进行讲解所以这里只是简单学习他们的使用。 using namespace std展开标准库就全部暴露出来了如果我们定义跟库重名的类型/对象/函数就会存在冲突问题。该问题在日常练习中很少出现但是项目开发中代码较多、规模大就很容易出现。所以建议在项目开发中使用像std::cout这样使用时指定命名空间 using std::cout展开常用的库对象/类型等方式。 4.缺省参数 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时如果没有指定实参则采用该形参的缺省值否则使用指定的实参。   一般在调用一个函数时我们都会对它进行传参缺省参数的意义在于当你没有给函数传参时它会自动默认传入你设置的缺省参数int a 0。 4.1 全缺省 void fun(int a 10, int b 20, int c 30) {cout a ;cout b ;cout c ;cout endl; }由此我们也可以看出缺省参数必须从右往左给因此我们给的参数是从左往右的左边的数据可以我们显示传参右边的可以使用缺省参数。 4.2 半缺省 那我们就再来看看半缺省顾名思义就是只有一部分有缺省值。 void fun(int a,int b,int c 30) {cout a endl;cout b endl;cout c endl; }注意 半缺省参数必须从右往左依次来给出不能间隔着给缺省参数不能在函数声明和定义中同时出现缺省值必须是常量或者全局变量C语言不支持编译器不支持 不同声明和定义中同时出现是因为如果定义中给的默认参数与声明中给的默认参数不同的话编译器是无法分别的因此统一都是在定义是再给默认参数缺省参数。 5.函数重载 函数重载是函数的一种特殊情况C允许在同一作用域中声明几个功能类似的同名函数这些同名函数的形参列表(参数个数或类型或类型顺序)不同常用来处理实现功能类似数据类型不同的问题。   系统会根据它们的参数类型自动匹配最相符的函数进行调用即使函数名相同也是可以的。 但是必须要满足形参列表(参数个数或类型或类型顺序)不同这三个条件中的一个才可以。 那么编译器是如何区分的呢 其实在编辑器内部调用这个函数时是通过它的函数名加地址去寻找它的每一个函数在链接时在内部的函数名编译器都会在你书写的函数名fun的基础上再根据它的参数来进行添加一些符号来修饰它。比如在VS2019中在链接过程中这个两个函数的函数名就是如图这样的在后面一个是 HN一个是NH。因此编译器才会准确的区分它们。   而在C语言中对于内部的函数名修饰是一样所以编译器是无法区别的。 通过这里就理解了C语言为什么没办法支持重载了因为同名函数没办法区分。而C是通过函数修饰规则来区分只要参数不同修饰出来的名字就不一样就支持了重载。 如果两个函数函数名和参数是一样的返回值不同是不构成重载的因为调用时编译器没办法区分。 6. 引用 引用不是新定义一个变量而是给已存在的变量取了一个别名也就是外号编译器不会为引用变量开辟内存空间它和它引用的变量共用同一块内存空间。   就比如一块空间名字是 a你又给它起了个外号叫 b虽然名字不一样但是是同一块空间。   看似两个名字实则是同一块空间一荣俱荣一损俱损你是我我是你的关系。需要注意的是引用类型必须和引用实体是同种类型的。 6.1 引用的特性 引用在定义时必须初始化一个变量可以有多个引用引用一旦引用一个实体再不能引用其他实体 int main() {int a 10;int b;//正确写法int b a;return 0; }这样写是不行的因为你是在给已存在变量取别名不初始化是无法作为别人的外号存在的。 int main() {int a 10;int ra a;int raa a;return 0; }这样写是可以的一个变量可以有很多个外号。但是一个外号只能给一个人用谁都能用岂不是就乱套了所以引用一旦引用一个实体再不能引用其他实体。   对于 const 修饰的变量意味着只能读不能写因此在为 const 变量取别名时也要加 const不能出现本来无法修改你加个外号就能修改的情况吧。 void test() {const int a 10;int ra a; // 该语句编译时会出错a为常量//正确写法const int ra a;const int ra a;int b 10; // 该语句编译时会出错b为常量//正确写法const int b 10;const int b 10;double d 12.34;int rd d; // 该语句编译时会出错类型不同//正确写法const int rd d; }而对于最后一个类型不一样的为什么加了 const 就可以了呢这是因为在进行隐式类型转化时会先生成一个临时的 int 常量先将 d 的值由 double 类型转为 int 类型赋给临时变量然后再为临时变量取的别名。因为是常量无法修改所以在取别名时也需要加 const。 6.2 引用的使用场景 作为函数的参数这样不需要指针就可以交换两个变量的值。 void Swap(int left, int right) {int temp left;left right;right temp; }作返回值。引用返回效率会更快一点因为直接返回的是变量的别名。在正常的函数中因此函数在调用完就被销毁了因此它是将返回值先给了一个临时变量由临时变量返回给主函数。因此需要注意的是引用返回时返回的必须是静态变量或者是堆上的变量。 int Count() {static int n 0;n;// ...return n; }以值作为参数或者返回值类型在传参和返回期间函数不会直接传递实参或者将变量本身直接返回而是传递实参或者返回变量的一份临时的拷贝因此用值作为参数或者返回值类型效率是非常低下的尤其是当参数或者返回值类型非常大时效率就更低。 6.3 引用和指针 指针和引用使用起来不一样但在底层实现是其实是一样的我们来看这样一段代码。 #includeiostream using namespace std; int main() {int a 10;int* pa a;int ra a;(*pa);ra;return 0; }虽然对于汇编不太理解但是不妨碍我们可以看出对于指针运算和引用运算编译器在底层用汇编实现是一致的因此我们就可以知道引用实际上也是通过指针来实现的。 引用概念上定义一个变量的别名指针存储一个变量地址。引用在定义时必须初始化指针没有要求引用在初始化时引用一个实体后就不能再引用其他实体而指针可以在任何时候指向任何 一个同类型实体没有NULL引用但有NULL指针在sizeof中含义不同引用结果为引用类型的大小但指针始终是地址空间所占字节个数(32 位平台下占4个字节)引用自加即引用的实体增加1指针自加即指针向后偏移一个类型的大小有多级指针但是没有多级引用访问实体方式不同指针需要显式解引用引用编译器自己处理引用比指针使用起来相对更安全 7.内联函数 以inline修饰的函数叫做内联函数编译时C编译器会在调用内联函数的地方展开没有函数调用建立栈帧的开销内联函数提升了程序运行的效率。 inline void Fun(int a, int b) {int tmp a;a b;b tmp; }int main() {int a 10, b 20;Fun(a, b);return 0; }int main() {int a 10, b 20;int tmp a;a b;b tmp;return 0; }内联函数的作用就是将上面的代码转化为下面的代码也就是不去调用函数了而是将函数代码在原地展开。那大家有没有发现这和C语言中的什么比较相似呢?没错就是宏。 #define Add(a,b) ((a) (b))这是用宏实现了一个加法函数我们知道宏就是直接在相应的位置替换但是我们知道操作符是有优先级的直接替换过去是有可能发生操作符优先级不正确导致出错的。 宏的缺点 不方便调试宏。因为预编译阶段进行了替换导致代码可读性差可维护性差容易误用。没有类型安全的检查 。 宏的优点 没有类型的严格控制。针对频繁调用小函数不需要建立栈帧提高性能。 因此为了避免这种错误C新增了内联函数inline来解决这个问题。不需要大家刻意的写很多括号来保证操作符的正确使用顺序。 7.1 特性 inline是一种以空间换时间的做法如果编译器将函数当成内联函数处理在编译阶段会用函数体替换函数调用缺陷可能会使目标文件变大优势少了调用开销提高程序运行效率。inline对于编译器而言只是一个建议不同编译器关于inline实现机制可能不同一般建议将函数规模较小(即函数不是很长具体没有准确的说法取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰否则编译器会忽略inline特性。《Cprime》第五版关于inline的建议内联只是向编译器发出一个请求编译器可以忽略这个请求。inline不建议声明和定义分离分离会导致链接错误。因为inline被展开就没有函数地址了链接就会找不到。 8.auto关键字 在早期C/C中auto的含义是使用auto修饰的变量是具有自动存储器的局部变量但遗憾的是一直没有人去使用它大家可思考下为什么   C11中标准委员会赋予了auto全新的含义即auto不再是一个存储类型指示符而是作为一个新的类型指示符来指示编译器auto声明的变量必须由编译器在编译时期推导而得。   也就是 auto 会自动推到出变量的类型在对于一些变量类型比较长是会方便的后续就会遇到。 typeid().name() 的作用就是识别一个变量的类型。   使用auto定义变量时必须对其进行初始化在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此auto并非是一种“类型”的声明而是一个类型声明时的“占位符”编译器在编译期会将auto替换为变量实际的类型。 8.1 注意事项 用auto声明指针类型时用auto和auto*没有任何区别但用auto声明引用类型时则必须加。   当在同一行声明多个变量时这些变量必须是相同的类型否则编译器将会报错因为编译器实际只对第一个类型进行推导然后用推导出来的类型定义其他变量。 void test_auto() {auto a 1, b 2; auto c 3, d 4.0; // 该行代码会编译失败因为c和d的初始化表达式类型不同 }auto不能作为函数的参数。auto不能直接用来声明数组。为了避免与C98中的auto发生混淆C11只保留了auto作为类型指示符的用法。auto在实际中最常见的优势用法就是跟以后会讲到的C11提供的新式for循环还有lambda表达式等进行配合使用。 9. 基于范围的for循环 我们通常遍历一个数组是这样的 int main() {int a[5] { 0,1,2,3,4 };for(int i 0; i 5; i){cout a[i] ;}return 0; }对于一个有范围的集合而言由程序员来说明循环的范围是多余的有时候还会容易犯错误。因此C11中引入了基于范围的for循环。for循环后的括号由号“ ”分为两部分第一部分是范围内用于迭代的变量第二部分则表示被迭代的范围。   实际过程是将 arr 中的一个数拿出来放到 e 中进行输出再继续拿第二个数…… 9.1 使用条件 for循环迭代的范围必须是确定的   对于数组而言就是数组中第一个元素和最后一个元素的范围对于类而言应该提供begin和end的方法begin和end就是for循环迭代的范围。 void test_for(int arr[]) {for(auto e : arr)cout e endl; }这样写就是有问题的因为 for 的范围不确定。 2. 迭代的对象要实现和的操作这里针对的是类。 10.指针控制nullptr 在良好的C/C编程习惯中声明一个变量时最好给该变量一个合适的初始值否则可能会出现不可预料的错误比如未初始化的指针。如果一个指针没有合法的指向我们基本都是按照如下方式对其进行初始化 void test_ptr() {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 f(int) {coutf(int)endl; } void f(int*) {coutf(int*)endl; } int main() {f(0);f(NULL);f((int*)NULL);return 0; }程序本意是想通过f(NULL)调用指针版本的f(int*)函数但是由于NULL被定义成0因此与程序的初衷相悖。   在C98中字面常量0既可以是一个整形数字也可以是无类型的指针(void*)常量但是编译器默认情况下将其看成是一个整形常量如果要将其按照指针方式来使用必须对其进行强转(void *)0。   因此在C中区分了这种情况让 nullptr 专门代指了指针。 10.1 注意事项 在使用nullptr表示指针空值时不需要包含头文件因为nullptr是C11作为新关键字引入的。在C11中sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。为了提高代码的健壮性在后续表示指针空值时建议最好使用nullptr。 11.总结 在初学C时需要记忆的地方有很多难度不大但细节较多建议大家整理一些笔记来帮助日后的复习。   此篇内容字数尚可初学C还是略感疲惫叹气不过与之前相比好多了愉悦。如果大家发现有什么错误的地方可以私信或者评论区指出喔虚心请教渴望大佬帮助。我会继续深入学习C希望能与大家共同进步那么本期就到此结束让我们下期再见觉得不错可以点个赞以示鼓励喔
http://www.tj-hxxt.cn/news/140860.html

相关文章:

  • 网站模版防被偷wordpress如何生成html代码
  • 网站前后台模板wordpress登录慢
  • 建设网站用什么网站开发哪里安全
  • 电子商务网站问题与解决方案wordpress头条
  • 网络营销概念及理解嘉峪关seo
  • php网站开发是做什么的榆林建设网站
  • 蚌埠市网站建设个人网站带论坛 备案
  • 网站建设费入免费铺货诚招代理商
  • 怎么用ps做网站ui创建个人网站
  • 坪山做网站公司杭州哪家公司网站做的好
  • 做营销网站那个好品牌营销策略包括哪些内容
  • 中卫网站推广软件wordpress如何开启ssl
  • 专业定制网站开发自己在哪里做网站
  • 路由侠怎么做网站映射网站制作公司浩森宇特
  • 本溪建网站网站建设常州青之峰
  • 破解织梦做的网站做网站都需要什么人团
  • 南阳免费网站建设关系建设的网站
  • 怎么用代码做网站wordpress目录
  • 物流网站建设评析中济建设有限公司网站
  • 网站 优化 关键字seo关键词排名优化哪家好
  • 免费企业自助建站信息发布网发布网页
  • 怎么增加网站浏览量新手怎样在手机上做电商
  • 福州做推广有哪些网站上海seo服务外包公司
  • 永州做网站网站建设需要什么资质
  • 郑州模板建站哪家好工作报告是组织进行沟通的有效渠道
  • 镇江seo网站优化做电商网站搭建就业岗位
  • 云服务器建立多个网站合肥论坛网
  • 公司网站空间申请网站建设 地址: 上海石门二路
  • 晨旭东方网站建设wordpress 9gag主题
  • 企业网站建设ppt模板泸州网站建设