我是先学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++ 的学习书籍,最权威的当属 C++ 的发明者 Bjarne Stroustrup 大佬所著的《The C++ Programming Language》,但是很明显这本书不适合初学者,更加适合的还得是《C++ Primer》,也很系统全面。至于再深入可以继续阅读诸如《Effective C++》、《STL源码剖析》、《深度探索C++对象模型》等书籍。
如果你想快速掌握C/C++编程,小编推荐我的C语言/C++编程学习基地【点击进入】!
都是学编程小伙伴们,带你入个门还是简简单单啦,一起学习,一起加油~
涉及:编程入门、游戏编程、windows编程、Linux编程、Qt、黑客等等......
我是先学C语言还是先学C++,实不相瞒,鱼和熊掌可兼得!的更多相关文章
- 新手最纠结的事。学什么语言最好?学什么语言有前途(or 钱途)?
这篇文章是转载自王根的博客,源地址:http://www.yinwang.org/blog-cn/2017/07/06/master-pl ,虽然王根是一个备受争议的人,不过这篇文章写的很好,我对于编 ...
- 转型IT学什么语言好,学编程语言为何要重视代码规范?
造价转IT需要注意什么,先学什么比较好?属于零基础,2019毕业,三本学校,男.自己的想法是先以副业来学习,在合适的时候转入it行业.1.以副业来学的话应该先学习什么比较好?2.如果要直接找工作的话先 ...
- C语言和C++的应用领域都在哪些?学C语言好,还是学习C++好?
从事嵌入式开发十几年,基本上围绕着这两种编程语言展开,都可以直接操作底层的编程语言,用的越熟练越是感觉工具属性越强.虽然两种编程语言分属于不同的编程思想,用的时间长了觉得差异也不是很大,现在就个人的从 ...
- 小C的故事(快速学C语言,,,极速版!)
前几天这篇博客写了太多废话! 删啦~~. 本篇博客只是为chd A协的全嫩小鲜肉入门C语言的预科, 如果你在此处学习C语言, 不幸走火入魔, 小弱概不负责. //请直接随便找个C语言编译器,抄一下下面 ...
- 边看MHA源码边学Perl语言之一开篇
边看MHA源码边学Perl语言之一开篇 自我简介 先简单介绍一下自己,到目前为此我已经做了7年左右的JAVA和3年左右php开发与管理,做java时主要开发物流行业的相关软件,对台湾快递,国际快递,国 ...
- 快看Sample代码,速学Swift语言(1)-语法速览
Swift是苹果推出的一个比较新的语言,它除了借鉴语言如C#.Java等内容外,好像还采用了很多JavaScript脚本里面的一些脚本语法,用起来感觉非常棒,作为一个使用C#多年的技术控,对这种比较超 ...
- C语言老司机学Python (五)
今天看的是标准库概览. 操作系统接口: 用os模块实现. 针对文件和目录管理,还有个shutil模块可以用. 例句: import os os.getcwd() # 返回当前的工作目录 os.chdi ...
- C语言老司机学Python (一)
Python 版本:3.6.4 参考网上教程:http://www.runoob.com/python3/python3-basic-syntax.html 开始了啊. 干咱们这行的老规矩,学新语言的 ...
- 学c++需要先学c语言吗?
看你的需求,如果是底层开发,就必须学习C语言.如果只是应用开发,可以直接从C++开始学习.实际上这两个语言是平等的,只是在语法上C++尽量与C兼容,但仍然有很多不同的地方. 1) C++不是C的超集. ...
随机推荐
- C#开发PACS医学影像处理系统(十二):绘图处理之图形标记
在医生实际使用过程中,对于有病灶的影像需要一些2D绘图操作,例如对于病灶的标记和测量, 这就牵涉到在WPF中的2D绘图操作技术,一般的思路是监听鼠标的按下和抬起以及运动轨迹,目前整理出的常用绘图和测量 ...
- Java一键部署包,Linux部署不用愁!!!
前言 昨天一哥们的弟弟突然问我有没有部署过的Linux,公司连个运维都没有,服务器都要后端部署.... 你有没有相似的遭遇呢?公司规模小,后端即是运维,一份工资干两份活,哈哈~ 为了解决这老弟的困惑, ...
- python 中简单的输出语句
1 python 中简单的输出语句 #coding:utf-8#输出的是整数,得到的也是整数,用raw_inputusername=raw_input('请输入用户名:')#输出的是整数或者字符串,得 ...
- [Java并发包学习八]深度剖析ConcurrentHashMap
转载自https://blog.csdn.net/WinWill2012/article/details/71626044 还记得大学快毕业的时候要准备找工作了,然后就看各种面试相关的书籍,还记得很多 ...
- 番外篇 - Linux环境准备
这是一个比较早的系列,最近发现一直没有更新... asp.net core跨平台,所以我们首先需要一个linux来验证,所以第一篇就是准备我们的环境 .netcore尝试在centos6. ...
- selenium过豆瓣滑动验证码
首先是加速度代码 def get_tracks(distance): """ 拿到移动轨迹,模仿人的滑动行为,先匀加速后匀减速 匀变速运动基本公式: ①v = v0+at ...
- 记一次Java获取本地摄像头(基于OpenCV)
OpenCV官网下载地址(下载安装后,在安装目录可以找到动态链接库和OpenCv.jar) https://opencv.org/releases/ 安装完成后,这是我的安装目录 maven 依赖(这 ...
- kmt字符串匹配
# -*- coding:utf-8 -*-class StringPattern: def findAppearance(self, A, lena, B, lenb): pos=0 tmp = 0 ...
- Tomcat 第四篇:请求处理流程(上)
1. 引言 既然是在讲 Tomcat ,那么一个 HTTP 请求的请求流程是无论如何也绕不开的. 首先抛开所有,使用我们现有的知识面,猜测一下一个请求被 Tomcat 处理的过程: 1. 客户端(浏览 ...
- Spring Boot第二弹,配置文件怎么造?
持续原创输出,点击上方蓝字关注我吧 前言 自从用了Spring Boot,个人最喜欢的就是Spring Boot的配置文件了,和Spring比起,Spring Boot更加灵活,修改的某些配置也是更加 ...