做电子芯片的有那些交易网站,网站备案法律,南阳哪里做网站,电脑二级网页打不开怎么解决文章目录 1. 前言2. C发展历史2. 1 C版本更新特性一览2. 2 关于C23的一个小故事: 3. C的重要性3. 1 编程语言排行榜3. 2 C在工作领域中的应用 4. C学习建议和书籍推荐4. 1 C学习难度4. 2 学习书籍推荐 5. C的第一个程序6. 命名空间6. 1 namespace的价值6. 2 namespace的定义6. … 文章目录 1. 前言2. C发展历史2. 1 C版本更新特性一览2. 2 关于C23的一个小故事: 3. C的重要性3. 1 编程语言排行榜3. 2 C在工作领域中的应用 4. C学习建议和书籍推荐4. 1 C学习难度4. 2 学习书籍推荐 5. C的第一个程序6. 命名空间6. 1 namespace的价值6. 2 namespace的定义6. 3 命名空间使用 1. 前言
在C系列博客正式开始之前我认为有必要了解一下关于C的一些发展历程以及一些比较细碎但重要的C和C语言的差异。
2. C发展历史 C的起源可以追溯到1979年当时Bjarne Stroustrup本贾尼·斯特劳斯特卢普在贝尔实验室从事计算机科学和软件工程的研究工作。面对项目中复杂的软件开发任务特别是模拟和操作系统的开发工作他感受到了现有语言(如C语言)在表达能力、可维护性和可扩展性方面的不足。 1983年Bjarne Stroustrup在C语言的基础上添加了面向对象编程的特性设计出了C语言的雏形此时的C已经有了类、封装、继承等核心概念为后来的面向对象编程奠定了基础。这一年该语言被正式命名为C。 在随后的几年中C在学术界和工业界的应用逐渐增多。一些大学和研究所开始将C作为教学和研究的首选语言而一些公司也开始在产品开发中尝试使用C。这一时期C的标准库和模板等特性也得到了进一步的完善和发展。 C的标准化工作于1989年开始并成立了一个ANSI和IS0International StandardsOrganization国际标准化组织的联合标准化委员会。1994年标准化委员会提出了第一个标准化草案。在该草案中委员会在保持斯特劳斯特卢普最初定义的所有特征的时还增加了部分新特征。 在完成C标准化的第一个草案后不久STLStandard Template Library诞生了STL是惠普实验室开发的一系软件的统称。它是由Alexander Stepanov、MengLee和David RMusser在惠普实验室工作时所开发出来的。在通过了标准化第一个草案之后联合标准化委员会又投票并通过了将STL包含到C标准中的提议。STL对C的扩展超出C的最初定义范围。虽然在标准中增加STL是个很重要的决定但也因此延缓了C标准化的进程。 1997年11月14日联合标准化委员会通过了该标准的最终草案。1998年C的ANSI/IS0标准被投入使用。 图为本贾尼博士 2. 1 C版本更新特性一览
版本特性概览C98 (1998)第一个标准化的C版本。C03 (2003)修订了C98标准增加了一些新特性如可选的具体模板实例化 (SSP)。C11 (2011)引入了许多新特性如列表初始化、自动类型推导、右值引用、lambda表达式、智能指针等。C14 (2014)在C11基础上进一步增加了一些新特性主要是对C11的小修小补。C17 (2017)引入了很多新特性如inline变量、fold表达式、if和switch控制语句中的初始化器等。C20 (2020)引入了许多重要的新特性如范围for循环、模块、协程、原始字符串字面量等。 2. 2 关于C23的一个小故事:
C一直被诟病的一个地方就是没有网络库(networking用于网络通信使用频率极高)networking之前是在C23的计划中的但是现在C23发布之后却没有networking在网上引发了一系列的吐槽。 过程确实很精彩但很遗憾结果就是networking并没有出现在C23上C作为面向底层的语言实际生产中使用的版本迭代速度是远远慢于新标准制定的所以想正式使用networking恐怕还有很长一段时间。
3. C的重要性
3. 1 编程语言排行榜
TIOBE排行榜是根据互联网上有经验的程序员、课程和第三方厂商的数量并使用搜索引擎(如Google、Bing、Yahoo!)以及Wikipedia、Amazon、YouTube和Baidu(百度)统计出排名数据只是反映某个编程语言的热门程度并不能说明一门编程语言好不好或者一门语言所编写的代码数量多少。 2024年9月TIOBE发布的编程语言排行榜 可以看到C具有十分高的热度目前排在所有编程语言中的第二名。 当然这个榜单的可信度并不强在之前很长的一段时间中C语言一直都是高于C的但现在C语言却以不小的劣势掉出了前三。看看就好不必较真。
3. 2 C在工作领域中的应用
C在领域服务器端、游戏(引擎)、机器学习引擎、音视频处理、嵌入式软件、电信设备、金融应用、基础库、操作系统、编译器、基础架构、基础工具、硬件交互等很多方面都有应用。 大型系统软件开发。如编译器、数据库、操作系统、浏览器等等。 音视频处理。常见的音视频开源库和方案有FFmpeg、WebRTC、Mediasoup、ijkplayer音视频开发最主要的技术栈就是C。 PC客户端开发。一般是开发Windows上的桌面软件比如WPS之类的技术的话一般是C和QTQT是一个跨平台的 C图形用户界面(Graphical UserInterfaceGUl)程序。 服务端开发。各种大型应用网络连接的高并发后台服务。这块Java也比较多C主要用于一些对性能要求比较高的地方。如:游戏服务、流媒体服务、量化高频交易服务等 游戏引擎开发。很多游戏引擎就都是使用C开发的游戏开发要掌握C基础和数据结构学习图形学知识掌握游戏引擎和框架了解引擎实现引擎源代码可以学习UE4、Cocos2d-x等开源引擎实现 嵌入式开发。嵌入式把具有计算能力的主控板嵌入到机器装置或者电子装置的内部通过软件能够控制这些装置。比如:智能手环、摄像头、扫地机器人、智能音响、门禁系统、车载系统等等粗略一点嵌入式开发主要分为嵌入式应用和嵌入式驱动开发。 机器学习引擎。机器学习底层的很多算法都是用C实现的上层用python封装起来。如果你只想准备数据训练模型那么学会Python基本上就够了如果你想做机器学习系统的开发那么需要学会C。 测试开发/测试。每个公司研发团队有研发就有测试测试主要分为测试开发和功能测试测试开发一般是使用一些测试工具(selenium、Jmeter等)设计测试用例然后写一些脚本进行自动化测试性能测试等有些还需要自行开发一些测试用具。功能测试主要是根据产品的功能设计测试用例然后手动的方式进行测试。 4. C学习建议和书籍推荐
4. 1 C学习难度
首先第一个问题C难学吗? 毋庸置疑地说C是一个相对难学难精的语言相比其他一些语言学习难度要高一些要陡峭一些这里有历史包袱的问题也有语言本身设计和发展历史的问题。网上以前流传着下面这个21天内自学精通C的梗。 尽管C的学习难度不算小但我会竭尽全力把每一篇博客写好如果你刚刚开始学习C不妨关注我我会持续带来更多的优质博客。
4. 2 学习书籍推荐 C Primer主要讲解语法经典的语法书籍前后中期都可以看前期如果自学看可能会有点晦涩难懂能看懂多少看懂多少中后期可以作为语法字典非常好用。
STL源码剖析主要从底层实现的角度庖丁解牛式地剖析STL的实现是侯捷老师的经典之作。可以很好的帮助我们学习别人用语法是如何实现出高效简洁的数据结构和算法代码如何使用泛型封装等。可以让我们不再坐井观天闭门造车中后期可以看。
Effctive C本书也是侯捷老师翻译的本书有的一句评价可以把C程序员分为看过此书的和没看过此书的。本书主要讲了55个如何正确高效使用C的条款建议中后期可以看一遍工作1-2年后再看一遍相信会有不一样的收获。
好的那么关于C的一些基础情况就说到这里下面开始正式的入门基础知识。
5. C的第一个程序
C兼容C语言绝大多数的语法所以C语言实现的hello world依旧可以运行C文件需要把文件后缀改为.cpp编译器看到是.cpp就会调用C编译器编译Linux下要用g编译不再是gcc。
你当然可以完全使用C语言的语法去实现第一个C程序Hello World但是严格地说纯C版本的Hello Word! 应该是这样写的
#includeiostream
using namespace std;
int main()
{cout Hello World! endl;return 0;
}或是
#includeiostream
int main()
{std::cout Hello World! std::endl;return 0;
}二者是等价的。正如当初初学C语言时看不懂Hello World程序一样这个你多半也看不明白本文接下来的内容就会将这个程序解释清楚。
6. 命名空间
6. 1 namespace的价值
在C/C中变量、函数和后面讲到的类都是大量存在的这些变量、函数和类的名称将都存在于全局作用域中可能会导致很多冲突。 c语言项目出现类似下面的程序的命名冲突是普遍存在的问题C引入namespace就是为了解决这样的问题使用命名空间的可以对标识符的名称进行本地化以避免命名冲突或名字污染。
#includestdio.h
#includestdlib.h //这个头文件中包含rand()函数
int rand 0;
int main()
{printf(%d, rand);return 0;
}这个代码中由于全局变量int与stdlib.h中的rand()函数命名冲突所以编译器会给出如下报错
6. 2 namespace的定义
定义命名空间需要使用到namespace关键字后面跟命名空间的名字然后接一对{}即可{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。namespace本质是定义出一个域这个域跟全局域各自独立不同的域可以定义同名变量所以下面的rand不再冲突了。
//创建一个命名空间使 rand变量不与 rand函数冲突
#includestdio.h
#includestdlib.hnamespace fhvyxyci
{//变量int rand 10;//函数int add(int a, int b){return a b;}//类型以struct结构体举例尽管它在C中有更好的上位替代struct fh{int v;double y;};//typedef 一个类型typedef int my_int;
}int main()
{printf(%p\n, rand); //这里访问的是stdlib.h中的rand()函数的地址printf(%d, fhvyxyci::rand); //::操作符用于访问命名空间中的成员这里访问的是命名空间fhvyxyci中的rand变量return 0;
}C中域有函数局部域全局域命名空间域类域。 域影响的是编译时语法查找一个变量/函数类型出处(声明或定义)的逻辑所有有了域隔离名字冲突就解决了。 局部域和全局域除了会影响编译查找逻辑还会影响变量的生命周期命名空间域和类域不影响变量生命周期。 namespace只能定义在全局当然它还可以嵌套定义。
#includestdio.h
#includestdlib.h
namespace fhvyxyci
{namespace fhvy{int rand 10;;}namespace xyci{int rand 11;}
}
int main()
{printf(%d\n, fhvyxyci::fhvy::rand);printf(%d\n, fhvyxyci::xyci::rand);printf(%p\n, rand);return 0;
}项目工程中多文件中定义的同名namespace会认为是一个namespace不会冲突。
//test.h
#pragma once
#includestdio.h
#includestdlib.h
namespace fhvyxyci
{int rand 11;double fh 10;int add(int a, int b);
}//test.cpp
#includetest.h
namespace fhvyxyci
{int add(int a, int b){return a b;}
}int main()
{printf(%d\n, fhvyxyci::rand);printf(%lf\n, fhvyxyci::fh);printf(%d\n, fhvyxyci::add(1, 2));return 0;
}这个代码可以正常地运行函数之间就如同正常的在头文件声明.cpp文件中定义一样只不过都要放在名称相同的命名空间中。
C标准库的所有函数/变量/类都放在一个叫std(standard)的命名空间中。不过尽管C兼容C但C语言的库在.cpp文件中并不在命名空间中都存在于全局。
6. 3 命名空间使用
编译查找一个变量的声明/定义时默认只会在局部或者全局查找不会到命名空间里面去查找。所以下面的情况1会编译报错。 我们要使用命名空间中定义的变量/函数有三种方式:
指定命名空间访问项目中推荐这种方式。using将命名空间中某个成员展开项目中经常访问的不存在冲突的成员推荐这种方式。展开命名空间中全部成员项目不推荐冲突风险很大日常小练习程序为了方便推荐使用。
using是C的一个关键字用于展开命名空间使用方式请参考下面的4种情况。 当要在命名空间之外对命名空间中的成员进行任何操作如访问调用时均使用::操作符。
情况1未做任何对应措施就尝试访问命名空间中的内容
#includestdio.h
namespace fhvyxyci
{int a 10;int b 11;
}int main()
{printf(%d\n, a);return 0;
}编译器给出报错 情况2指定命名空间访问
#includestdio.h
namespace fhvyxyci
{int a 10;int b 11;
}int main()
{printf(%d\n, fhvyxyci::a); // ::操作符用于访问命名空间中的成员printf(%d\n, fhvyxyci::b);return 0;
}
//该代码正常运行情况3using将某个特定成员展开
#includestdio.h
namespace fhvyxyci
{int a 10;int b 11;
}
//展开命名空间fhvyxyci中的成员b不需要指出类型
using fhvyxyci::b;int main()
{printf(%d\n, a);printf(%d\n, b);return 0;
}
//该代码报错与情况1的报错一样情况4using将整个命名空间展开
#includestdio.h
namespace fhvyxyci
{int a 10;int b 11;
}
//展开整个命名空间fhvyxyci
using namespace fhvyxyci;
int main()
{printf(%d\n, a);printf(%d\n, b);return 0;
}
//该代码正常运行谢谢你的阅读喜欢的话来个点赞收藏评论关注吧 我会持续更新更多优质文章 文章转载自: http://www.morning.twhgn.cn.gov.cn.twhgn.cn http://www.morning.xtlty.cn.gov.cn.xtlty.cn http://www.morning.rxydr.cn.gov.cn.rxydr.cn http://www.morning.ghwtn.cn.gov.cn.ghwtn.cn http://www.morning.rblqk.cn.gov.cn.rblqk.cn http://www.morning.zckhn.cn.gov.cn.zckhn.cn http://www.morning.qwdlj.cn.gov.cn.qwdlj.cn http://www.morning.cttgj.cn.gov.cn.cttgj.cn http://www.morning.zsfooo.com.gov.cn.zsfooo.com http://www.morning.rdwm.cn.gov.cn.rdwm.cn http://www.morning.srnth.cn.gov.cn.srnth.cn http://www.morning.jhrlk.cn.gov.cn.jhrlk.cn http://www.morning.kpygy.cn.gov.cn.kpygy.cn http://www.morning.ttvtv.cn.gov.cn.ttvtv.cn http://www.morning.lmcrc.cn.gov.cn.lmcrc.cn http://www.morning.ssmhn.cn.gov.cn.ssmhn.cn http://www.morning.qrwnj.cn.gov.cn.qrwnj.cn http://www.morning.lwwnq.cn.gov.cn.lwwnq.cn http://www.morning.qpqwb.cn.gov.cn.qpqwb.cn http://www.morning.lmcrc.cn.gov.cn.lmcrc.cn http://www.morning.rtlth.cn.gov.cn.rtlth.cn http://www.morning.jfqpc.cn.gov.cn.jfqpc.cn http://www.morning.xshkh.cn.gov.cn.xshkh.cn http://www.morning.zdxinxi.com.gov.cn.zdxinxi.com http://www.morning.hnhkz.cn.gov.cn.hnhkz.cn http://www.morning.tgczj.cn.gov.cn.tgczj.cn http://www.morning.yzzfl.cn.gov.cn.yzzfl.cn http://www.morning.kdjtt.cn.gov.cn.kdjtt.cn http://www.morning.wrbx.cn.gov.cn.wrbx.cn http://www.morning.ghwdm.cn.gov.cn.ghwdm.cn http://www.morning.sooong.com.gov.cn.sooong.com http://www.morning.gpryk.cn.gov.cn.gpryk.cn http://www.morning.nwtmy.cn.gov.cn.nwtmy.cn http://www.morning.grfhd.cn.gov.cn.grfhd.cn http://www.morning.qddtd.cn.gov.cn.qddtd.cn http://www.morning.cnlmp.cn.gov.cn.cnlmp.cn http://www.morning.xbmwm.cn.gov.cn.xbmwm.cn http://www.morning.iqcge.com.gov.cn.iqcge.com http://www.morning.wkpfm.cn.gov.cn.wkpfm.cn http://www.morning.pkwwq.cn.gov.cn.pkwwq.cn http://www.morning.pnntx.cn.gov.cn.pnntx.cn http://www.morning.mfcbk.cn.gov.cn.mfcbk.cn http://www.morning.jghqc.cn.gov.cn.jghqc.cn http://www.morning.ttnfc.cn.gov.cn.ttnfc.cn http://www.morning.mznqz.cn.gov.cn.mznqz.cn http://www.morning.kspfq.cn.gov.cn.kspfq.cn http://www.morning.dddcfr.cn.gov.cn.dddcfr.cn http://www.morning.cmrfl.cn.gov.cn.cmrfl.cn http://www.morning.lthpr.cn.gov.cn.lthpr.cn http://www.morning.ktskc.cn.gov.cn.ktskc.cn http://www.morning.spftz.cn.gov.cn.spftz.cn http://www.morning.zlwg.cn.gov.cn.zlwg.cn http://www.morning.fswml.cn.gov.cn.fswml.cn http://www.morning.rkrcd.cn.gov.cn.rkrcd.cn http://www.morning.rxkq.cn.gov.cn.rxkq.cn http://www.morning.nkpml.cn.gov.cn.nkpml.cn http://www.morning.qczpf.cn.gov.cn.qczpf.cn http://www.morning.mttck.cn.gov.cn.mttck.cn http://www.morning.hkng.cn.gov.cn.hkng.cn http://www.morning.tpps.cn.gov.cn.tpps.cn http://www.morning.wjlnz.cn.gov.cn.wjlnz.cn http://www.morning.lrzst.cn.gov.cn.lrzst.cn http://www.morning.hkpn.cn.gov.cn.hkpn.cn http://www.morning.diuchai.com.gov.cn.diuchai.com http://www.morning.lsjgh.cn.gov.cn.lsjgh.cn http://www.morning.wtyqs.cn.gov.cn.wtyqs.cn http://www.morning.ghxkm.cn.gov.cn.ghxkm.cn http://www.morning.qpljg.cn.gov.cn.qpljg.cn http://www.morning.qdsmile.cn.gov.cn.qdsmile.cn http://www.morning.mwwnz.cn.gov.cn.mwwnz.cn http://www.morning.kpcky.cn.gov.cn.kpcky.cn http://www.morning.pwksz.cn.gov.cn.pwksz.cn http://www.morning.nkmw.cn.gov.cn.nkmw.cn http://www.morning.lhldx.cn.gov.cn.lhldx.cn http://www.morning.pwdgy.cn.gov.cn.pwdgy.cn http://www.morning.gfhng.cn.gov.cn.gfhng.cn http://www.morning.kcypc.cn.gov.cn.kcypc.cn http://www.morning.srkqs.cn.gov.cn.srkqs.cn http://www.morning.rkxqh.cn.gov.cn.rkxqh.cn http://www.morning.hmmnb.cn.gov.cn.hmmnb.cn