文章目录C教程大纲C发展历史C版本更新C学习的一些参考文档C的应用领域C学习书籍推荐一、第一个C程序二、C语言的不足、C的改进2.1命名冲突2.2命名空间2.3命名空间的定义2.4命名空间的使用2.4.1命名空间展开和头文件展开的区别三、C的输入、输出详解四、缺省参数缺省值、默认值五函数重载六、引用七、结语C教程大纲教程内容:C语法STL高阶数据结构C发展历史1983年Bjarne Stroustrup在C语⾔的基础上添加了⾯向对象编程的特性设计出了C语⾔的雏形此时的C已经有了类、封装、继承等核⼼概念为后来的⾯向对象编程奠定了基础。这⼀年该语⾔被正式命名为C。C版本更新C的初代标准发布于1998年简称C98之后的一个版本直到2003年才发布称为C03后续的命名沿用C0x,Cxx。其中的几个有较大更新的版本时C98、C11、C20.C学习的一些参考文档本文给出一些C学习过程中会用到的参考文档包含标准库语法等的代码和用法。https://legacy.cplusplus.com/reference/https://zh.cppreference.com/w/cpphttps://en.cppreference.com/w/C的应用领域C的应⽤领域服务器端、游戏引擎、机器学习引擎、⾳视频处理、嵌⼊式软件、电信设备、⾦融应⽤、基础库、操作系统、编译器、基础架构、基础⼯具、硬件交互等很多⽅⾯都有。大型系统软件开发。如编译器、数据库、操作系统、浏览器等等音视频播放器开发比如B站PC客户端开发图形化界面服务端开发游戏服务器融媒体服务量化高频交易等对性能要求高的服务游戏引擎的开发很多游戏的引擎的开发都依赖于C游戏开发需要掌握C基础和数据结构学习图形学知识掌握游戏引擎和框架了解引擎实现引擎源代码可以学习UE4Cocos2d-x等开源引擎的实现嵌入式开发C的高性能在嵌入式领域具有优势嵌入式把具有计算能力的主控板嵌入到机器装置或者电子装置的内部通过软件能够控制这些装置。比如电子手环、摄像头、扫地机器人等、智能影响、门禁系统、车载系统等等、粗略一点嵌入式开发主要分为嵌入式应用和嵌入式驱动开发机器学习引擎不大推荐可以胜任大概67分机器学习的底层语言是C上层用python封装起来如果只是想要准备数据训练模型那么只需要掌握python就好了如果是想要做机器学习系统的开发那么需要掌握C测试开发/纯测试领域每个公司都有研发团队有研发就必然有测试通过测试才能上线投入应用测试主要分为测试开发和功能测试C学习书籍推荐语法字典C primer高效C这本书非常好C基础学习得差不多的时候可以看工作一两年也可以看STL源码分析C学习的中后期看一、第一个C程序#includestdio.hintmain(){printf(hello world\n);return0;}这时候就有老铁要问了主播主播你的C程序为什么一股子C味啊是的那是因为C就是在C的基础上改进而来的所以C兼容C的语法C语言的那套我们放在C同样适用但是高不高效就是另外一回事了改进了那些地方后面的教程都会介绍。在C我们有自己的打印语法需要用到输出流#includeiostreamusingnamespacestd;intmain(){couthello worldendl;return0;}cout是ostream类的一个全局对象标准输出流适用于窄字符用于控制台输出能够自动识别要输出的类型。相比C语言的优势不用手动设置输出类型的格式。是流插入运算符和C语言的左移操作符是一样的操作符重载endl是一种换行符和\n作用效果相同endl是一个函数二、C语言的不足、C的改进2.1命名冲突C语言中不能允许同一个作用域中有同名变量、函数等的定义有时候我们代码写完原本好好的没有编译报错结果一包上一个头文件出现了重定义的报错这就非常的抓马了2.2命名空间为了解决命名冲突等等问题C创新了命名空间这一工具命名空间的价值在C/C中变量、函数名和后面会遇到的类都是大量存在的这些变量、函数和类的名称将都存在于全局作用域中可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化以避免命名冲突或者名字污染namespace关键字的出现就是针对这种问题的。2.3命名空间的定义定义一个命名空间需要用到namespace关键字后面跟命名空间的名字然后接一对**{}**即可注意不需要加分号{}所括住的就是命名空间中的成员命名空间中可以定义变量函数和类型等非常方便namespace本质是定义出了一个域这个域和全局域独立不同的域可以定义同名变量不会产生命名冲突C中的域有局部域、全局域、命名空间域、类域、域影响的是编译时系统从何处查找一个变量/函数/类型出处的逻辑有了域的隔离编译器在查找时就不会遇到名字冲突的问题。局部域和全局域会影响编译查找逻辑还会影响变量的生命周期命名空间域和类域不影响变量的生命周期。注意namespace命名空间只能定义在全局域不过它时可以嵌套的定义的就是一个命名空间中还可以定义别的不同名的命名空间同一个工程下的不同文件或者同一文件不同位置定义的同名命名空间会自动合并不会彼此冲突。C标准库是放在一个叫stdstandard的命名空间里的tips命名空间不能定义在局部只能定义在全局不能定义在main函数中要访问命名空间的变量需要访问限定符需要用访问限定符访问限定符就像你开门回家需要家们钥匙开电脑需要解锁一样访问限定符可以看作访问特定域的钥匙对哪个域使用就能调用域空间里面的东西命名空间只对名字做空间隔离不影响生命周期就像水果店的水果虽然用不同的篮子装做了空间上的隔离但是却不会影响它们能存放的时间生命周期同个命名空间可以定义在多个文件自动合并命名空间可以嵌套定义调用时要层层访问先从最外层开始直到你要调用的命名空间2.4命名空间的使用命名空间的使用方法编译器在编译查找一个变量的时候默认是先局部域再全局域不会到命名空间域里面查找所以我们要用访问限定符指定它去哪个域里面查找如果访问限定符前面什么都没有跟就默认是全局域。2.4.1命名空间展开和头文件展开的区别头文件相当于把头文件拷贝到当前文件内命名空间展开后就是没有墙的限制了相当于在全局域可以直接到全局域中访问三、C的输入、输出详解是input output stream的缩写是标准的输入、输出流库定义了标准的输入、输出对象。std::cin是istream类的一个对象它主要面向窄字符的标准输入流。std::out是ostream类的一个对象它主要面向窄字符的标准输出流。std::endl是一个函数流插入输出时相当于一个换行字符加刷新缓冲区是流插入运算符是流提取运算符。C的输入输出更加方便因为它会自动识别类型格式不要像C语言那样手动设置指定的格式C的流能更好的支持自定义类型的输入输出。四、缺省参数缺省值、默认值1. 全缺省全部给满默认值2. 半缺省只给一部分缺省值规定只能从左往右设缺省值不能间隔tips:缺省参数在声明和定义中不能同时给且只能在函数声明的参数列表给。五函数重载函数重载简单来说就是函数名相同,同名函数构成函数重载的几种情况1. 函数名相同但是参数类型不同2. 参数个数不同3. 参数顺序不同实际上也是参数类型不同对应位置上无参函数和全缺省函数在无参调用时可能产生调用歧义。同一作用域同名函数才能构成函数重载返回值不可构成函数重载函数重载只能通过参数构成调用时无法区分六、引用引用实际上是给变量取别名它的底层是指针七、结语这个系列名叫《批量生成程序员–那些你不可错过的C教程》虽然名字起的很酷目标也很理想化但是作为一种输出的方式我希望我的博客能带给初学者一些启发站在初学者的角度写下这个系列的第一篇文章深感幸福。希望自己能坚持下去代码之路很难也很累累到有时候兴趣也被消磨殆尽还要咬牙坚持笔者是一个很懒的人希望能通过这种方式激发自己的斗志任何的建议和意见欢迎一同交流我们共同进步