河北网站设计制作,在服务器上搭建网站,建立什么本地网站赚钱,wordpress百度插件一、C的发展历史
-我们将C的发展史归纳为节点的形式展示
关键节点#xff1a;
起源#xff08;1979–1983#xff09;#xff1a;丹麦科学家本贾尼斯特劳斯特卢普在贝尔实验室开发“带类的 C 语言”#xff0c;旨在为 C 语言添加面向对象特性#xff0c;1983 年正式命…一、C的发展历史-我们将C的发展史归纳为节点的形式展示关键节点起源1979–1983丹麦科学家本贾尼·斯特劳斯特卢普在贝尔实验室开发“带类的 C 语言”旨在为 C 语言添加面向对象特性1983 年正式命名为 C。标准化起步1983–19981985 年首本权威著作发布逐步加入虚函数、模板等核心特性1998 年 ISO 发布首个标准 C98确立语言规范。功能完善2003–20172003 年 C03 修正技术缺陷2011 年 C11 开启“现代 C”引入 auto、lambda 等重要特性2014/2017 年标准进一步优化易用性。现代演进2020 至今2020 年 C20 新增概念、模块、协程等重大特性2023 年 C23 完善现有功能持续平衡性能与抽象能力。版本演进-我们通过表格来了解C的版本更新过程C参考文档Reference - C Reference cppreference.com注意第一个链接不是C官方文档标准只更新到了C11但是以头文件的形式呈现内容比较容易看懂。后面一个是C官方的文档信息很全更新也是最新的但是对比第一个就没那么容易看了另外两者都是英文版的。这两个文档建议大家结合起来使用。C参考书籍C Primer主要讲解语法经典的语法书籍前后中期都可以看前期如果自学看可能会有点晦涩难懂能看懂多少看懂多少就当预习中后期作为语法字典非常好用。STL源码剖析主要从底层实现的角度结合STL源码庖丁解牛式剖析STL的实现是侯捷老师的经典之作。可以很好的帮助我们学习别人用语法是如何实现出高效简洁的数据结构和算法代码如何使用泛型封装等。让我们不再坐井观天闭门造车本书课程上⼀半以后中后期可以看。Effctive C本书也是侯捷老师翻译的本书有的⼀句评价把C程序员分为看过此书的和没看过此书的。本书主要讲了55个如何正确高效使用C的条款建议中后期可以看⼀遍工作1-2年后再看⼀遍相信会有不⼀样的收获。二、C的第一个程序-C兼容大多数的CC语言中实现打印操作在C中依然可以运行但是C有自己的一套输入输出方式我们对比来看一下C版本代码语言javascriptAI代码解释#includestdio.h int main() { printf(Hello World\n); return 0; }C版本大家看不懂后续会讲解代码语言javascriptAI代码解释#includeiostream using namespace std; int main() { cout Hello World endl; cout Hello World \n; return 0; }三、命名空间namespace的价值在C/C中变量、函数和后面要学到的类都是⼤量存在的这些变量、函数和类的名称将都存在于全局作用域中可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化以避免命名冲突或名字污染namespace关键字的出现就是针对这种问题的。C语言项目类似下面程序这样的命名冲突是普遍存在的问题C引入namespace就是为了更好的解决这样的问题代码语言javascriptAI代码解释#includestdio.h #includestdlib.h int rand 10; int main() { printf(%d\n, rand);//因为rand是stdlib的个库函数重定义了 return 0; }namespace的定义定义命名空间需要使用到namespace关键字后面跟命名空间的名字然后接⼀对{ }即可{}中 即为命名空间的成员。命名空间中可以定义变量/函数/类型等。namespace本质是定义出⼀个域这个域跟全局域各自独立不同的域可以定义同名变量所以下面的rand不在冲突了。C中域有函数局部域全局域命名空间域类域域影响的是编译时语法查找⼀个变量/函数/ 类型出处(声明或定义)的逻辑所有有了域隔离名字冲突就解决了。局部域和全局域除了会影响 编译查找逻辑还会影响变量的⽣命周期命名空间域和类域不影响变量生命周期。namespace只能定义在全局当然他还可以嵌套定义。项目工程中多文件中定义的同名namespace会认为是⼀个namespace不会冲突。C标准库都放在⼀个叫std(standard)的命名空间中。正常的命名空间定义 (注意看注释)代码语言javascriptAI代码解释#includestdio.h #includestdlib.h namespace Cx330 { int rand 10; int Add(int x,int y) { return x y; } struct Node { struct Node* next; int data; }; }//无分号 int main() { //默认访问的是全局的rand函数指针 printf(%p\n, rand); //编译器语法查找确认规则是默认先局部查找-全局查找-没有找到就报未声明的标识符这个错误 //::域作用限定符这里指定作用域就直接按这个域去找-没有找到就报未声明的标识符这个错误 printf(%d\n, Cx330::rand); //这底下的就不详细讲述了很好理解 printf(%p\n, Cx330::Add); printf(%d\n, Cx330::Add(5, 3));//8 struct Cx330::Node node; return 0; }命名空间的嵌套使用代码语言javascriptAI代码解释//命名空间的嵌套使用 #includestdio.h #includestdlib.h namespace Cx330 { namespace A { int rand 10; int Sub(int x, int y) { return x - y; } } namespace B { int rand 20; int Sub(int x, int y) { return x - y; } } } int main() { printf(%d\n, Cx330::A::rand);//10 printf(%d\n, Cx330::B::rand);//20 printf(%d\n, Cx330::A::Sub(5, 3));//2 printf(%d\n, Cx330::B::Sub(6, 2));//4 return 0; }我们在项目经常可以使用到命名空间的嵌套大家可以看下面这个图片来理解一下-多文件中可以定义同名namespace他们会默认合并在一起就像同一个namespace一样这里演示起来逻辑简单但是代码量还是比较多的。大家有兴趣的可以拿之前的栈和队列自己试一下命名空间的使用编译查找一个变量的声明/定义时默认只会在局部或者全局查找不会到命名空间里面去查找。我们使用命名空间中定义的变量/函数有以下三种方式指定命名空间访问这种形式在项目中比较推荐using将命名空间中某个成员展开项目中经常访问的不存在冲突的成员推荐使用这种方式展开命名空间中的全部成员项目中不推荐冲突风险很大日常刷题中比较方便推荐使用-我们下面先拿std库里的几个函数来举例说明一下后续会详细讲述代码语言javascriptAI代码解释#includeiostream #includealgorithm //命名空间中成员部分展开 using std::cout; int main() { int a, b; std::cin a b;//输入 cout a b \n;//输出 return 0; }-可以观察到部分展开了之后cout就不需要在前面加东西了但是cin还是要的命名空间中成员全部展开代码语言javascriptAI代码解释#includeiostream #includealgorithm //命名空间中成员全部展开 using namespace std; int main() { int a, b; cin a b;//输入 cout a b \n;//输出 return 0; }-这里就都不需要指定命名空间去访问了平常刷题时使用起来确实是很方便的大的项目还是推荐大家不要这样用