zoukankan      html  css  js  c++  java
  • 学C语言≠学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++ 的学习书籍,最权威的当属 C++ 的发明者 Bjarne Stroustrup 大佬所著的《The C++ Programming Language》,但是很明显这本书不适合初学者,更加适合的还得是《C++ Primer》,也很系统全面。至于再深入可以继续阅读诸如《Effective C++》、《STL源码剖析》、《深度探索C++对象模型》等书籍。

        如果小伙伴们想自学C/C++语言,就来和我一起学习吧,这里组建了一个零基础编程者联盟!不管你是大牛还是小白,大家可以一起成长和进步。 每天进步一点点,才能快乐一点点!


     
  • 相关阅读:
    Atitit 华为基本法 attilax读后感
    Atitit 华为管理者内训书系 以奋斗者为本 华为公司人力资源管理纲要 attilax读后感
    Atitit 项目版本管理gitflow 与 Forking的对比与使用
    Atitit 管理的模式扁平化管理 金字塔 直线型管理 垂直管理 水平管理 矩阵式管理 网状式样管理 多头管理 双头管理
    Atitit 乌合之众读后感attilax总结 与读后感结构规范总结
    深入理解 JavaScript 异步系列(4)—— Generator
    深入理解 JavaScript 异步系列(3)—— ES6 中的 Promise
    深入理解 JavaScript 异步系列(2)—— jquery的解决方案
    深入理解 JavaScript 异步系列(1)——基础
    使用 github + jekyll 搭建个人博客
  • 原文地址:https://www.cnblogs.com/mu-ge/p/13585526.html
Copyright © 2011-2022 走看看