我是先学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的超集. ...
随机推荐
- 15个随机图片API
15个随机图片API 妈妈再也不用担心我网站没图用了呜 请不要重复刷新此页面 ! 找了很久的说,你难道不想收藏一下吗 其中有些 API 速度并不太好,可能会拖慢贵站的速度 我也不能保证这些 API 能 ...
- 图解并发与并行-分别从CPU和线程的角度理解
本文作为图解java并发编程的第三篇,前2篇访问地址如下所示: 图解进程线程.互斥锁与信号量-看完还不懂你来打我 8成以上的java线程状态图都画错了--图解java并发第二篇 一.CPU角度的并发与 ...
- mysql修改默认数据存储路径
1.先关闭mysql服务 可cmd--services.msc进入关闭服务 或cmd命令输入net stop mysql57关闭服务 2.进入C:\ProgramData\MySQL\MySQL Se ...
- adb命令—monkey篇
monkey 目录 monkey 1.Monkey介绍 2.Monkey是用来做什么的 3.Monkey程序介绍 下面就是一些Monkey命令了 1.Monkey介绍 顾名思义,Monkey就是猴子, ...
- 学习 | css3实现进度条加载
进度条加载是页面加载时的一种交互效果,这样做的目的是提高用户体验. 进度条的的实现分为3大部分:1.页面布局,2.进度条动效,3.何时进度条增加. 文件目录 加载文件顺序 <link rel=& ...
- 【python】列表与数组之间的相互转换
安装numpy pip3 install numpy 列表转数组 np.array() import numpy as np a = [1, 2, 3] b = np.array(a) 列表转数组 a ...
- 第3章 02 python字符串类型及操作
字符串切片 取字符串从结尾到开头,相当于字符串逆序 转义符 转义符表达特定字符的本意 转义符 \“ ----> ” 字符串操作符 例子: 获取星期字符串 定义星期 获取用户 ...
- Windows批处理(cmd/bat)常用命令学习
前言 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务.用户只需双击批处理文件便可执行任务,而无需重复输入相同指令.编写批处理文件非常简单,但难点在于确保一切按顺序 ...
- Spring系列之新注解配置+Spring集成junit+注解注入
Spring系列之注解配置 Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势,注解代替xml配置文件可以简化配置,提高开发效率 你本来要写一段很长的代码来构造一个 ...
- 记一次"截图"功能的项目调研过程!
目录 项目需求 功能调研 AWT Swing Html2Image PhantomJS Headless Chrome 实现方案 结论 项目需求 最近,项目接到了一个新需求,要求对指定URL进行后端模 ...