最近,身边有许多小伙伴已经开始学习编程了,但是呢,学习又会碰到许多的问题,其中作为新手小白提到最多的问题就是编程语言的选择。

每次遇到这种问题,看起来很简单,但是又有很多小伙伴搞不清编程语言之间的关系;今天呢,作为一名从C入门的程序员的我,我来为大家探讨一下我对C语言和C++这两门编程语言的关系,如果小伙伴们有不同看法,也欢迎批评指正,评论区见。

 

C语言和C++到底是什么关系?

首先C++和C语言本来就是两种不同的编程语言,但C++确实是对C语言的扩充和延伸,并且对C语言提供后向兼容的能力。对于有些人说的C++完全就包含了C语言的说法也并没有错。

C++一开始被本贾尼·斯特劳斯特卢普(Bjarne Stroustrup)发明时,起初被称为“C with Classes”,即「带类的C」。很明显它是在C语言的基础上扩充了类class等面向对象的特性和机制。但是后来经过一步步修订和很多次演变(如下图所示),最终才形成了现如今这个支持一系列重大特性的庞大编程语言。


就像经典书籍《Effective C++》一开头就说的,现如今我们提到C++,都应该视其为一个庞大的「语言联邦」,最起码包含如下几个重要的组成部分:

面向过程编程

面向对象编程

泛型编程

元编程

函数式编程

STL标准库

这其中的第一部分「面向过程编程」,正是C++提供的向后兼容C语言的部分;

所以你能看到市面上在售的大部分讲C++编程的书,一开始前几个章节基本都是在讲「面向过程编程」的内容,包括但不限于:数据类型、变量、运算符、表达式、语句、判断、循环、函数、指针等等这些内容。

不学C语言能直接学C++吗?

还是像前面所说,C++编程语言的第一大重要组成部分就是「面向过程编程」,而这正是C语言老大哥的领域。即使没有学过C语言,一上来就直接学习C++的小伙伴,应该也难逃『面向过程』这一部分的内容。因为市面上在售的大部分讲C++编程的书,开始的章节都在讲「面向过程编程」的内容。

从理论上来说,学C++前并不一定非得学C语言,但是有C语言底子再去学C++往往更具优势,最起码「面向过程编程」这一部分内容能够轻车熟路。

但是遗憾的是,即使是《C++ Primer》这种700多页厚的权威C++书籍,开头也只有很少一部分在讲「面向过程编程」,所以对于面向过程这一部分的讲述是肯定没有专门讲C语言的书籍剖析得细致和全面的,不然也不会有这种重点侧重于指针相关的《C和指针》等这类书籍的出现了。

所以个人建议是在学C++之前,C语言的基础还是尽量要夯实,肯定是有帮助的。

C学得好的,学习C++是否更具优势?

是的。

最起码学C++时,里面的「面向过程」这一部分内容可以说轻车熟路了。

C++能替代C语言吗?

既然C++这么强大,包含这么多模块和范式,而且也几乎包含了C语言面向过程这一部分的内容,那为啥还要学C语言呢?都直接学习C++它不香嘛?

是的,C++很强大没错,但那些强大的范式和机制本身带来的包袱就不轻,也确实给学习者造成了不小的负担,甚至劝退了很多人。

而反观C语言,C语言本身就是一个把能力、性能、效率和学习成本权衡得非常极致的一种编程语言,以至于大学阶段必开的程序设计课程里基本都有C语言的身影。

而且C语言的应用领域极度广泛,上到操作系统底层的原生接口,下到普通的应用层开发,C语言都有着不小的功劳。以至于这么多年来,在Tiobe编程语言排行榜里,C语言都是居高位不下。

 

而且2020开年C语言重回巅峰王座,一举夺得「2019年度编程语言」。虽然这只是一个看起来很无聊的排名,但多多少少能说明一些事情。

 

所以无论是过去,现在,甚至是未来,近50岁的C语言老将军依然永不为奴。

只有C++这种面向对象的语言才适合大型项目吗?

C++的出现的确是为了更方便地开发大型应用程序,毕竟面向对象编程里的很多重要思想和机制都对大型项目和复杂系统所要求的项目工程化、代码复用性/扩展性/可维护性等提供了强大的支撑。

但是摆在眼前的事实告诉我们,即便是C语言,也照样可以构建出极其复杂的系统和软件。上到Linux这种旷世伟大的操作系统内核,小到被各个公司重度依赖的Redis、Nginx等开源软件或框架,都是C语言的代表作品。

所以有时候我们不得不承认的是,大家所说的抽象能力更多的是看写这个程序的人,而并非编程语言本身。

小结

总结一下就是:

✍ C语言和C++是两个不同的编程语言,只不过内容上有一定的重叠;

✍ C语言是一门很强大的编程语言,我觉得有机会还是要学一下;

✍ 一般来说,有了C语言的基础,上手C++也会更快;

✍ C++和C各有各的选用考虑和应用场景,并没有谁更好一说,学不学看自己的兴趣和自身技术发展的考量。

书籍推荐

最后聊一聊学习C语言和C++的书籍。

个人觉得如果想系统学习这两门语言,最好还是得看一下经典的书籍。

关于C语言学习书籍:

最最权威的当然是C语言的发明者Dennis M. Ritchie所著的《The C Programming Language》(它也有中文版的),除此之外《C Primer Plus》也很系统全面,值得推荐一下。

关于C++的学习书籍:

最权威的当属C++的发明者Bjarne Stroustrup大佬所著的《The C++ Programming Language》,但是很明显这本书不适合初学者,更加适合的还得是《C++ Primer》,也很系统全面。至于再深入可以继续阅读诸如《Effective C++》、《STL源码剖析》、《深度探索C++对象模型》等书籍。

看到这里是不是又学到了很多新知识呢~

如果你很想学编程,小编推荐我的C语言/C++编程学习基地【点击进入】!

都是学编程小伙伴们,带你入个门还是简简单单啦,一起学习,一起加油~

还有许多学习资料和视频,相信你会喜欢的!

涉及:游戏开发、常用软件开发、编程基础知识、课程设计、黑客等等......

 

 

很多人都搞不清楚C语言和C++的关系!今天我们来一探究竟为大家解惑~的更多相关文章

  1. 很多人都在埋怨没有遇到好的团队,但好的团队不可能凭空出现,一流的团队不能仅靠团队成员努力,作为Leader,要有可行的规划,并坚定地执行、时势地调整(转)

    <西游记>中的唐僧团队历经千难万险,终于求得真经,目标明确.分工合理为这支队伍最终走向成功奠定了基础.唐僧从一开始,就为这个团队设定了西天取经的目标,虽然经历各种挫折与磨难,但目标从未动摇 ...

  2. 上传伪技术~很多人都以为判断了后缀,判断了ContentType,判断了头文件就真的安全了。是吗?

    今天群里有人聊图片上传,简单说下自己的经验(大牛勿喷) 0.如果你的方法里面是有指定路径的,记得一定要过滤../,比如你把 aa文件夹设置了权限,一些类似于exe,asp,php之类的文件不能执行,那 ...

  3. [转帖](区块链补习班)ERC20很多人都听过,但ERC是什么你真的了解吗?

    (区块链补习班)ERC20很多人都听过,但ERC是什么你真的了解吗? http://baijiahao.baidu.com/s?id=1600948969290990883&wfr=spide ...

  4. 听说特斯拉花了4个月研发出新ERP,然后很多人都疯了

    欢迎关注微信公众号:sap_gui (ERP咨询顾问之家) 最近这件事儿在SAP圈里炒的挺火的,最主要是因为这几个关键词: 放弃SAP.4个月.自研ERP: 这则新闻一出来,很多人都兴高采烈,都要疯了 ...

  5. 震惊!很多人都不知道 CSS Grid 框架早就有了!

    前言 写作本文起源于知乎的一个问题:[CSS Grid 布局那么好,为什么至今没有人开发出基于 Grid 布局的前端框架呢?] 这篇文章拖沓了两个月,是因为真的不知道从哪里说好.这个问题的所有回答几乎 ...

  6. PriorityQueue 是线性结构吗?90%的人都搞错了!

    文章首发于「陈树义」公众号及个人博客 shuyi.tech 其实这个问题的完整描述是:Java 中的 PriorityQueue 实现,其数据的逻辑结构是线性结构吗?其数据的物理结构又是什么? 估计很 ...

  7. 99%的人都搞错了的java方法区存储内容,通过可视化工具HSDB和代码示例一次就弄明白了

    https://zhuanlan.zhihu.com/p/269134063  番茄番茄我是西瓜 那是我日夜思念深深爱着的人啊~ 已关注   6 人赞同了该文章 前言 本篇是java内存区域管理系列教 ...

  8. 原来现在很多人都用SignalR来实现Chat Room

    今天从一个业余开发的群里,看到有人要求这样一个项目需求: 1,)学员可以通过在线课堂找到自己喜欢的老师和课程. 2,)每个人可以建立自己课堂,每个课堂扣分多个子房间,交流群.设置管理员:有录音功能,可 ...

  9. 很多人都不知道的监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法

    版权声明:本文为博主原创文章,未经博主允许不得转载. 在实际的应用中,我们常常需要实现在移动app和浏览器中点击返回.后退.上一页等按钮实现自己的关闭页面.调整到指定页面或执行一些其它操作的 需求,那 ...

随机推荐

  1. C#开发PACS医学影像处理系统(一):开发背景和说明

    本系列文章将从以下模块和大家分享和讨论使用C#开发医学软件PACS和RIS系统, 国内相关资料比较少,也借此机会丰富一下医学软件开发生态,讨论技术难点,希望大家互相帮助共同进步. 章节介绍及截图预览: ...

  2. [程序员代码面试指南]递归和动态规划-换钱的方法数(DP,完全背包)

    题目描述 给定arr,arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim,求组成aim的方法数. 解题思路 完全背包 和"求换钱的 ...

  3. [程序员代码面试指南]栈和队列-最大值减去最小值 小于或等于num 的子数组的数量(单调队列)

    题目 给定数组arr和整数num,求数组的子数组中有多少个的满足"最大值减去最小值<=num". 解题思路 分析题目,有结论: 如果数组arr[i...j]满足条件,则它的每 ...

  4. IOC 原理

    SpringIOC实现原理 1. 依赖倒置 假设我们设计一辆汽车:先设计轮子,然后根据轮子大小设计底盘,接着根据底盘设计车身,最后根据车身设计好整个汽车.这里就出现了一个“依赖”关系:汽车依赖车身,车 ...

  5. echarts配置进度池

    近日,使用dataV中的配置,完成了进度池图表,但是有有一个缺点,就是官方没有动画方面的配置.如下图: 为了给这个进度池添加动画效果,我反向的在进度池上面铺一层由一格一格与进度池中相同的块状组成的与背 ...

  6. cookie、session和md5加密

    cookie Http无状态协议,只能在同一个网站(包括多个页面)下获取,存储在客户端本地的一段信息,帮助我们存储信息获取信息.但是同样有风险:我们自己在浏览器上可以操作或者设置Cookie. con ...

  7. Go-常量-const

    常量:只能读,不能修改,编译前就是确定的值 关键字: const 常量相关类型:int8,16,32,64 float32,64 bool string 可计算结果数学表达式 常量方法 iota pa ...

  8. c#数据处理总结(分组、交并差与递归)

    前言:最近项目比较忙,完全没有时间写下总结笔记,今天抽出时间来写下笔记,供写后台的你来做数据处理后台代码编写的参考. 一.分组 var GroupForList = numberList.GroupB ...

  9. 小白也能看懂的Redis教学基础篇——朋友面试被Skiplist跳跃表拦住了

    各位看官大大们,双节快乐 !!! 这是本系列博客的第二篇,主要讲的是Redis基础数据结构中ZSet(有序集合)底层实现之一的Skiplist跳跃表. 不知道那些是Redis基础数据结构的看官们,可以 ...

  10. p.array 的shape (2,)与(2,1)的分别是什么意思

    numpy.ndarray.shap是返回一个数组维度的元组. (2,)与(2,1)的区别如下:   ndarray.shape:数组的维度.为一个表示数组在每个维度上大小的整数元组.例如二维数组中, ...