这是最近一周时间几个读者小伙伴所提的问题,我顺手截了两个图。

实不相瞒,这类问题之前也经常看到。

 

 

每次遇到这种问题,看起来很简单,但是打字一时半会还真说不清,想想今天周末了,写一篇文章来统一聊聊吧,如果小伙伴们有不同看法,也欢迎批评指正,评论区见。

 

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++,实不相瞒,鱼和熊掌可兼得!的更多相关文章

  1. 新手最纠结的事。学什么语言最好?学什么语言有前途(or 钱途)?

    这篇文章是转载自王根的博客,源地址:http://www.yinwang.org/blog-cn/2017/07/06/master-pl ,虽然王根是一个备受争议的人,不过这篇文章写的很好,我对于编 ...

  2. 转型IT学什么语言好,学编程语言为何要重视代码规范?

    造价转IT需要注意什么,先学什么比较好?属于零基础,2019毕业,三本学校,男.自己的想法是先以副业来学习,在合适的时候转入it行业.1.以副业来学的话应该先学习什么比较好?2.如果要直接找工作的话先 ...

  3. C语言和C++的应用领域都在哪些?学C语言好,还是学习C++好?

    从事嵌入式开发十几年,基本上围绕着这两种编程语言展开,都可以直接操作底层的编程语言,用的越熟练越是感觉工具属性越强.虽然两种编程语言分属于不同的编程思想,用的时间长了觉得差异也不是很大,现在就个人的从 ...

  4. 小C的故事(快速学C语言,,,极速版!)

    前几天这篇博客写了太多废话! 删啦~~. 本篇博客只是为chd A协的全嫩小鲜肉入门C语言的预科, 如果你在此处学习C语言, 不幸走火入魔, 小弱概不负责. //请直接随便找个C语言编译器,抄一下下面 ...

  5. 边看MHA源码边学Perl语言之一开篇

    边看MHA源码边学Perl语言之一开篇 自我简介 先简单介绍一下自己,到目前为此我已经做了7年左右的JAVA和3年左右php开发与管理,做java时主要开发物流行业的相关软件,对台湾快递,国际快递,国 ...

  6. 快看Sample代码,速学Swift语言(1)-语法速览

    Swift是苹果推出的一个比较新的语言,它除了借鉴语言如C#.Java等内容外,好像还采用了很多JavaScript脚本里面的一些脚本语法,用起来感觉非常棒,作为一个使用C#多年的技术控,对这种比较超 ...

  7. C语言老司机学Python (五)

    今天看的是标准库概览. 操作系统接口: 用os模块实现. 针对文件和目录管理,还有个shutil模块可以用. 例句: import os os.getcwd() # 返回当前的工作目录 os.chdi ...

  8. C语言老司机学Python (一)

    Python 版本:3.6.4 参考网上教程:http://www.runoob.com/python3/python3-basic-syntax.html 开始了啊. 干咱们这行的老规矩,学新语言的 ...

  9. 学c++需要先学c语言吗?

    看你的需求,如果是底层开发,就必须学习C语言.如果只是应用开发,可以直接从C++开始学习.实际上这两个语言是平等的,只是在语法上C++尽量与C兼容,但仍然有很多不同的地方. 1) C++不是C的超集. ...

随机推荐

  1. Java的枚举简单应用

    /** * 请用枚举方式实现如下应用: * 客户去旅店住房, * 客户分普通客户,和vip客户,vip分白金和钻石客户 * 不同的客户有不同的折扣 * 入住的房间分单人房,双人房和套房 * 不同的房间 ...

  2. Unity3D获得服务器时间/网络时间/后端时间/ServerTime,适合单机游戏使用

    说明 一些游戏开发者在做单机游戏功能时(例如:每日奖励.签到等),可能会需要获得服务端标准时间,用于游戏功能的逻辑处理. 问题分析 1.自己如果有服务器:自定义一个后端API,客户端按需请求就行了: ...

  3. sqli-labs 1-10关

    学习sql注入的必做靶场我终于来尝试一下下了. 第一关 ?id=1'时出现 在测试?id=1' and '1'='1,页面正常 ?id=1' and '1'='2  页面错误 判断存在单引号字符型注入 ...

  4. Linux实战(13):Centos8 同步时间

    前言 以下操作是通过ntpdate命令实现同步 timedatectl set-timezone Asia/Shanghai # 设置时区 rpm -ivh http://mirrors.wlnmp. ...

  5. ECMAScript 6新特性简介

    目录 简介 ECMAScript和JavaScript的关系 let和const 解构赋值 数组的扩展 函数的扩展 简介 ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言 ...

  6. Python记录日志模块推荐-loguru!

      作者:小张学Python 本文链接: https://mp.weixin.qq.com/s/dkNkEohPl6H2VopUrpxxZg 转载请注明来源!! 前言 在做项目的时候一直在用Pytho ...

  7. 【vue】---- 新版脚手架搭建项目流程详解

    一.概述 本文将介绍vue项目完整的搭建流程,在使用新版本的脚手架基础上,进行了一系列的完善和配置.主要内容如下: 1.项目初始化 安装脚手架 创建项目 项目结构 2.项目搭建配置 引入第三方插件 路 ...

  8. 龙芯3a4000办公机安装软件及美化记录

    1.硬件平台: CPU:龙芯3a4000 Linux内核版本:4.19.90-1.lns7.2.mips64el 操作系统:Debian 10(buster) 使用过龙芯3a3000和3a4000两款 ...

  9. 趣图:这是拿offer极高的面试经验

      扩展阅读 趣图:面试谈薪资就要这种底气 趣图:IT培训出来找工作 趣图:这是招聘超神级别的程序员?

  10. Salesforce LWC学习(二十六) 简单知识总结篇三

    首先本篇感谢长源edward老哥的大力帮助. 背景:我们在前端开发的时候,经常会用到输入框,并且对这个输入框设置 required或者其他的验证,当不满足条件时使用自定义的UI或者使用标准的 inpu ...