手机app视频制作,南京网站优化工具,福州网站建设找时时在网络,结婚证app制作软件为什么会衍生出C#xff1f;
C语言是结构化和模块化的语言#xff0c;适合处理较小规模的程序。对于复杂的问题#xff0c;规模较大的程序#xff0c;需要高度的抽象和建模时#xff0c;C语言则不合适。为了解决软件危机#xff0c;20世纪80年代#xff0c;计算机界提出…为什么会衍生出C
C语言是结构化和模块化的语言适合处理较小规模的程序。对于复杂的问题规模较大的程序需要高度的抽象和建模时C语言则不合适。为了解决软件危机20世纪80年代计算机界提出了00P(object oriented programming: 面向对象)思想支持面向对象的程序设计语言应运而生。
1982年Biarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念发明了-种新的程序语言。为了表达该语言与C语言的渊源关系命名为C。因此: C是基于C语言而产生的它既可以进行C语言的过程化程序设计(这也是C兼容C语言的原因)又可以进行以抽象数据类型为特点的基于对象的程序设计还可以进行面向对象的程序设计。 C祖师爷的介绍 本贾尼·斯特劳斯特卢普Bjarne Stroustrup1950年6月11日-丹麦人计算机科学家在德克萨斯AM大学担任计算机科学的主席教授。他最著名的贡献就是开发了C程序设计语言。
1982年美国ATT公司贝尔实验室的本贾尼博士在C语言的基础上引入并扩充了面向对象的概念发明了—种新的程序语言。为了表达该语言与C语言的渊源关系它被命名为C。而本贾尼博士被尊称为C语言之父。 1979 年贝尔实验室的本贾尼等人试图分析 unix 内核的时候试图将内核模块化于是 在 C 语言的基础上进行扩展增加了类的机制 完成了一个可以运行的预处理程序称之为 C with classes 。C也是在不断更新的(完善和添加新语法等等) C还在不断发展 但现在公司主流使用的还是C98和C11目前重点掌握这两个即可其他的版本语法可以等待工作以后随着对C理解不断加深再去了解其他版本语法特性。 C的重要性 下图数据来自TIOBE编程语言社区2021年12月最新的排行榜 在30多年的发展中C/C几乎一 致稳居前5。 在工作领域中C的作用 1. 操作系统以及大型系统软件开发 所有操作系统几乎都是 C/C 写的许多大型软件背后几乎都是 C 写的比如 Photoshop 、 Office 、 JVM(Java 虚拟机 )等究其原因还是性能高可以直接操控硬件。 2. 服务器端开发 后台开发主要侧重于业务逻辑的处理即对于前端请求后端给出对应的响应现在主流采 用java 但内卷化比较严重大厂可能会有 C 后台开发主要做一些基础组件中间件、 缓存、分布式存储等。服务器端开发比后台开发跟广泛包含后台开发一般对实时性要求 比较高的比如游戏服务器、流媒体服务器、网络通讯等都采用 C 开发的。 3. 游戏开发 PC 平台几乎所有的游戏都是 C 写的比如魔兽世界、传奇、 CS 、跑跑卡丁车等市面上 相当多的游戏引擎都是基于 C 开发的比如 Cocos2d 、虚幻 4 、 DirectX 等。三维游戏领 域计算量非常庞大底层的数学全都是矩阵变换想要画面精美、内容丰富、游戏实时性 搞这些高难度需求无疑只能选 C 语言。比较知名厂商腾讯、网易、完美世界、巨人网 络等。 4. 嵌入式和物联网领域 嵌入式就是把具有计算能力的主控板嵌入到机器装置或者电子装置的内部能够控制这些 装置。比如智能手环、摄像头、扫地机器人、智能音响等。 谈到嵌入式开发大家最能想到的就是单片机开发 ( 即在 8 位、 16 位或者 32 位单片机产品或者 裸机上进行的开发 ) 嵌入式开发除了单片机开发以外还包含在 soc 片上、系统层面、驱动 层面以及应用、中间件层面的开发。 常见的岗位有嵌入式开发工程师、驱动开发工程师、系统开发工程师、 Linux 开发工程 师、固件开发工程师等。 知名的一些厂商比如以华为、 vivo 、 oppo 、小米为代表的手机厂以紫光展锐、乐鑫为 代表的芯片厂以大疆、海康威视、大华、 CVTE 等具有自己终端业务厂商以及海尔、海 信、格力等传统家电行业。 随着 5G 的普及物联网 ( 即万物互联 ) 也成为了一种新兴势力比如阿里 lot 、腾讯 lot 、京 东、百度、美团等都有硬件相关的事业部。 5. 数字图像处理 数字图像处理中涉及到大量数学矩阵方面的运算对 CPU 算力要求比较高主要的图像处理 算法库和开源库等都是 C/C 写的比如 OpenCV 、 OpenGL 等大名鼎鼎的 Photoshop 就是 C 写的。 6. 人工智能 一提到人工智能大家首先想到的就是 python 认为学习人工智能就要学习 python 这个 是误区 python 中库比较丰富使用 python 可以快速搭建神经网络、填入参数导入数据就 可以开始训练模型了。但人工智能背后深度学习算法等核心还是用 C 写的。 7. 分布式应用 近年来移动互联网的兴起各应用数据量业务量不断攀升后端架构要不断提高性能和并发 能力才能应对大信息时代的来临。在分布式领域好些分布式框架、文件系统、中间组件等 都是 C 开发的。对分布式计算影响极大的 Hadoop 生态的几个重量级组件 HDFS 、 zookeeper 、 HBase 等也都是基于 Google 用 C 实现的 GFS 、 Chubby 、 BigTable 。包括分 布式计算框架 MapReduce 也是 Google 先用 C 实现了一套之后才有开源的 java 版本。 除了上述领域外在科学计算、浏览器、流媒体开发、网络软件等都是C比较适合的场景 作为一名老牌语言的常青树C一直霸占编程语言前5名肯定有其存在的价值。 C的介绍就到这里吧你还记得学习C语言第一节课在电脑屏幕上输出hello world的喜悦感吗 接下来我们以C的形式输出hello world #includeiostream
using namespace std;int main()
{cout hello world endl;return 0;
} 我们先不用看懂全部代码 比如using namespace stdcout endl是什么意思
咱们不急先听我娓娓道来我会在下面解释到的解开困惑的 第一个知识 命名空间 namespace
当我们用C语言运行这段代码会出现报错
#includestdio.h
#includestdlib.h
int rand 10;int main()
{printf(%d , rand);return 0;
} 为什么呢因为在头文件stdlib.h库里面就包含了rand函数我们再次使用rand定义了全局变量因此会出现命名冲突但C语言无法解决这种命名冲突问题所以C祖师爷为了解决命名冲突问题提出了namespace来解决。 命名空间一般用namespace自己定义名字
比如我使用的是namespace as (as就是命名空间的名字)
用%p访问rand是因为rand是头文件里面的rand函数 编译器会推荐用%p访问
#includestdio.h
#includestdlib.hnamespace as
{int rand 10;
}
int main()
{printf(%p, rand);return 0;
} 那怎么访问命名空间里面的rand的值呢
使用 : :域作用限定符来访问
#includestdio.h
#includestdlib.hnamespace as
{int rand 10;
}
int main()
{printf(%p, rand);printf(%d, as::rand);return 0;
} 命名空间相当于用围墙把rand保护了起来且留了一个入口入口上面有牌匾里面有恶犬 生人勿近 会咬人只能有熟人进去喂它(rand)食物和与它互动。
#includestdio.h
#includestdlib.hnamespace as
{int rand 10;struct Node{struct Node* next;int val;};int Add(int left, int right){return left right;}
}
int main()
{printf(%p\n, rand);printf(%d\n, as::rand);printf(%d\n, as::Add(2, 3));struct as::Node node;return 0;
} 假设同一个命名空间有相同的变量会怎么样呢会不会自己和自己打一架
实际上命名空间是可以嵌套的
#includestdio.h
#includestdlib.hnamespace as
{int rand 10;namespace as1{int rand 30;}namespace as2{int rand 20;}struct Node{struct Node* next;int val;};int Add(int left, int right){return left right;}
}
int main()
{printf(%p\n, rand);printf(%d\n, as::rand);printf(%d\n, as::as1::rand);printf(%d\n, as::as2::rand);printf(%d\n, as::Add(2, 3));struct as::Node node;return 0;
} 比如你在公司需要写项目比如栈为了防止与同事写的冲突就可以运用命名空间
Stack.h
#pragma once
#includestdio.h
#includestdlib.hnamespace fk
{typedef struct Stack{int* a;int sz;int capacity;}ST;void STInit(ST* ps);void STPush(ST* ps,int x);
}test.cpp
#includeStack.hnamespace fk
{void STInit(ST* ps){ps-a NULL;ps-capacity ps-sz 0;}void STPush(ST* ps, int x){//....}
}int main()
{fk::ST st;fk::STInit(st);fk::STPush(st, 1);fk::STPush(st, 2);fk::STPush(st, 3);
}
那么它们运行起来不会冲突吗 同一个工程中允许存在多个相同名称的命名空间 , 编译器最后会合成同一个命名空间中。 一个工程中的 test.h 和上面 test.cpp 中两个fk 会被合并成一个。 当我们每次访问栈的时候都要使用命名空间名称域作用限定符是不是有点太麻烦了 有没有什么方法能直接访问呢 这个时候就有了 usingnamesapce命名空间名称 上面我们用C输出hello world时候运用到了这个 test.cpp
#includeStack.hnamespace fk
{void STInit(ST* ps){ps-a NULL;ps-capacity ps-sz 0;}void STPush(ST* ps, int x){//....}
}using namespace fk;
int main()
{ST st;STInit(st);STPush(st, 1);STPush(st, 2);STPush(st, 3);
}只需要在test.cpp写上一句 using namespace fk即可
那么using namespace std是什么意思呢
std是C官网标准库的命名空间当我们展开std时库里面的函数就可以使用了
那么std库里面的函数能随意展开吗答案是否定的
在我们平常练习C时可以展开自己定义的命名空间和std库的命名空间但在实际工程上是不能随意展开的容易出现冲突。 #includeiostream是C的头文件 类似于C语言的#includestdio.h
iIn OOut 输入与输出 是流插入
C为了有自己的换行符有了endl endlend line.
#includeiostreamint main()
{// 是流插入int a 10;std::cout a \n;int b 20;double e 13.14;// 可以自动识别数据类型int c 545;std::cout b \n;std::cout e \n;std::cout c std::endl;return 0;
} 在我们不展开C的库函数时只能用域作用限定符来cout和endl例如std::cout std::endl
但每次指定命名空间不方便又害怕C库里面函数全部暴露 又有风险冲突
那么怎么办呢我们可以指定展开命名空间 例如下图
#includeiostream
using std::cout;
using std::endl;
int main()
{// 是流插入int a 10;cout a \n;int b 20;double e 13.14;// 可以自动识别数据类型int c 545;cout b \n;cout e \n;cout c endl;return 0;
} cout中的Cconsole(控制台) cin是流提取 相当于C语言的scanf
#includeiostream
using std::cout;
using std::endl;
int main()
{int a 20;int b 30;cout a endl b endl;std::cin a b;return 0;
} 如果要控制数字精度怎么办呢使用C因为C兼容C
#includeiostream
using std::cout;
using std::endl;
int main()
{int a 20;int b 30;double c 13.1424;cout a endl b endl;//控制精度用C 因为C兼容Cprintf(%.1lf\n, c);return 0;
}