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

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

 

 

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

 

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、黑客等等......

 

最新文章

  1. [No000091]SVN学习笔记2-TortoiseSVN Client初级操作update(获取)、commit(提交)
  2. [转载]Linux Bond的原理及其不足
  3. (转)理解MySQL——索引与优化
  4. [译]JavaScript源码转换:非破坏式与再生式
  5. JavaScript高级程序设计学习笔记--表单脚本
  6. laravel的学习感受
  7. linux编程中接收主函数返回值以及错误码提示
  8. Informatica Lookup Transformation组件的Connect 与Unconnected类型用法
  9. c++11 正则表达式基本使用
  10. KMP串匹配算法解析与优化
  11. 重拾C,一天一点点_5
  12. C++与Lua交互(二)
  13. linux学习笔记(3)-文件系统
  14. Spring+MyBatis实践—MyBatis数据库访问
  15. Socket的连接问题
  16. 如何修复在Microsoft Azure中“虚拟机防火墙打开,关闭RDP的连接端口”问题
  17. python使用pyapns进行ios推送消息
  18. collections——高性能容器数据类型
  19. powerdesigener 12.5注册机
  20. SVM(三)—Kernels(核函数)

热门文章

  1. swift基本数据类型使用-字典使用
  2. [算法与数据结构]使用Java泛型实现栈
  3. python里面的project、package、module分别是什么
  4. 仿苏宁移动web页面 自适应 rem&less
  5. 人工智能顶级会议最佳论文里的“DaDianNao”是什么鬼?
  6. 1.Concurrent概述
  7. 使用SpringBoot的方式配置过滤器
  8. ch4inrulz: 1.0.1靶机渗透
  9. 关于消息中间件ActiveMQ的企业级应用
  10. 手把手教你ASP.NET Core:使用Entity Framework Core进行增删改查