一、前言

  对于理工科学生来说,这个答案可能很简单,因为这是一门必修课。而对于程序员来说选择一门编程语言,在某种程度上,对职业生涯的发展会产生重大的影响,所以必须慎之又慎。那么,为什么要选择一门诞生了将近半个世纪的语言?本文不是老生常谈的废话,如:"C 语言是编程的基础"、"学好 C 语言,走遍天下都不怕"等等,本文力争详尽而又有理的回答这个问题,旨在成为最好的为什么要学习和使用 C 的文章。

  二、C 语言

  C 语言是由美国 AT&T 贝尔实验室的研究员 Dennis Ritchie 在 B 语言的基础上,最初作为改造 Unix 操作系统的开发语言,并伴随着 Unix 操作系统兴起而流行,后来,随着微型计算机的发展,C 开始被移植到其他操作系统平台上,成为独立的程序设计语言。

  下图摘自 TIOBE 编程语言排行榜,过去 30 年 90% 时间里 C 都是独领风骚的,仅偶尔被 Java 超越:

  那么是因为一门语言一直位于排行榜的第一名就该去学习和使用吗?显然不是,人云亦云是程序员的大忌。为操作系统而生的标签注定了 C 不可能平庸,实话实说,C 是一门很难学习和使用的编程语言,没有编译原理、操作系统和计算机体系结构扎实的基础知识,根本不可能把 C 学的明白、用的顺手。C 作为一门工程实用性极强的语言,提供了对操作系统和内存的精准控制,高性能的运行时环境,源码级的跨平台编译等优点,才是我们必须学习和使用 C 的理由。

  同时,幸运的是 C 也是个有趣的东西,对编程的认知越深,就会越觉得有意思,我简单列举一些 C 的优点:

    2.1)结构化设计语言,语法清晰、结构简单,模块化使得程序的各个部分除了必要的信息交流外彼此独立,便于开发、调试以及调试。
    2.2)运算符多,把括号、赋值、强制类型转换等都作为运算符处理,灵活使用各种运算符可以大大提高编程效率。
    2.3)数据结构丰富,能实现各种复杂的数据类型的运算,引入指针、结构体概念使程序效率更高。
    2.4)为操作系统而生,可以像汇编语言一样对位、字节和地址进行操作,允许直接访问物理地址对硬件进行操作,把高级语言的基本结构和语句与低级语言的实用性结合起来。
    2.5)程序执行效率高,一般比汇编程序生成的目标代码效率低 10%~20%。
    2.6)可移植性好,C 语言抽象了针对 CPU 编程的细节,能广泛应用于针对大型操作系统和系统软件的编写。
    2.7)具备强大的绘图功能,和 C++ 一样也可以写出很优雅的二维、三维图形和动画。

  有人说,C 是 C++ 的子集,C 能做到的事,C++ 一样能做到,并且还可以做的更好,如:三大面向对象特性、GUI 编程,诚然,我承认在 GUI 编程领域 C++ 占据着绝对的统治地位,至今无人能撼动。但真的有必要用 C++ 来替代 C 完成工作吗?很多时候 C++ 解决问题的思路真的比 C 更先进吗?

  

  三、C 和 C++ 比较

  写到这一段的时候我有一种战战兢兢、如履薄冰的感觉,毕竟 C、C++ 是广大程序员都很熟悉东西,打起嘴炮来也是极其恐怖的,其实在关乎信仰的问题上,任何的争论都是无止境的,也是无意义的。我希望大家不要把大量精力用来争论纯粹的语言优劣上,而是去思考如何的正确的把事情做好,什么是正确的做事——快速高效的开发,保障快速稳定的运行,快速简单的维护。

  下图是嘴炮大神 Linus Torvalds 当年抨击 C++ 和他周围那些 C++ 大牛程序员们的犀利言辞,其实我个人并不欣赏 Linus 的个人风格,我还是希望大家能心平气和的谈谈 C 相比 C++ 的一些优点和现状:

     3.1)隐式操作:C 简单直接、结构清晰,每行代码都能清楚的被反汇编成相应的语句,系统会严格按照你的代码去执行。而 C++ 则不尽然,简单的语句也说不清楚究竟有多少次构造和拷贝,这样编写底层代码是完全不行的,底层需要精准和严格的控制。

3.2)语言接口:现代软件工程项目的开发,不但对性能有很高要求,对于语言接口的对接能力也有很高要求,因为偌大的一个项目很少仅使用一种语言来进行开发,对于底层,C++ 对内存和硬件的控制不如 C 简洁精准;对于很多动态语言和中间件,如:PHP、Python 和 Apache、Redis,都受了 C 的很大影响,甚至就是 C 开发出来的东西,对接起来非常方便。没错儿,其实 C++ 采用迂回的方式也能对接的,但是,远远不如 C 方便,开发和维护成本非常高。
    3.3)硬件层:
      3.2.1> 分配内存:系统加电后运行,经过汇编初始化栈,然后再跳转到 C 语言的 start_init() 函数去,这时候内存分配机制都还没有建立,C++ 如何定义类?如何实例化对象?
       3.2.2> 标准库依赖:C 的所有特性都可以不依赖任何库运行,如有必要,可以按照特定需求自己编写库。
      3.2.3>处理器兼容:C++ 的类是依赖基地址+偏移地址的寻址方式,很多微处理器只有简单的给定地址寻址,不支持一条语句实现 base + offset 的寻址机制,很多 C++ 代码编译出来需要更多的指令来运算地址,导致性能下降了太多。
    3.4)应用层:C++ 在做应用层尤其是 GUI 编程,这是 C++ 的传统强项,我一直坚持 C 也能优雅的做出图像和动画,但开发效率确实较 C++ 低很多,最近有个很火的 RUST 语言,号称是未来唯一能取代 C++ 的编程语言,感兴趣的同学可以多关注下。
  四、总结
  下面我列举了 10 多个目前热门的发展方向,粗略的介绍了下列项目里最常用的编程语言:
由上图可知,操作系统、编译原理、数据结构与算法等等基础知识,是深入理解、掌握和灵活运用 C 的重要前提,现阶段程序员职业生涯超过一半的热门方向直接或间接与 C 有关,我想,学好 C 的重要性也就不言而喻了。
转自:博客园的 AMG 架构师

为什么要学习和使用 C 语言?相关推荐

  1. 给要学习.NET(c#语言)的新手一些学习方法

    推荐两本书 第一本是<21天学通c#语言> 可能这本书的出版时间有点早,一些新的技术没涉及到,但是作为基础这本书是很不错的. [原 书 名] Sams Teach Yourself C# ...

  2. 为什么劝你要学习Golang以及GO语言(Go语言知识普及)

    Go语言 一. Go语言的由来 Go语言亦叫Golang语言,是由谷歌Goggle公司推出. 传统的语言比如c++,大家花费太多时间来学习如何使用这门语言,而不是如何更好的表达写作者的思想,同时编译 ...

  3. C语言结构联合位字段知识体系总结大学霸IT达人

    C语言结构联合位字段知识体系总结大学霸IT达人 C语言的基础类型中只能去定义单一类型的变量用于指代数据,但在现实生活中我们常常要处理的数据却会包含多种类型的数据. 例如,公司员工的信息管理,每个员工的 ...

  4. 语言 重量计算_大师之光:有种跨越国界的语言叫C++

    语言太重要了,因为他的重要性,每个人都花很多时间来学习语言,幼儿时先学习母语,略长大了开始学习外语,成年了可能再进一步巩固母语,或者学习更多的外语. 对于越来越多的现代人来说,除了学习人类的语言外,还 ...

  5. [GO语言基础] 三.变量声明、数据类型、标识符及编程练习12题

    作为网络安全初学者,会遇到采用Go语言开发的恶意样本.因此从今天开始从零讲解Golang编程语言,一方面是督促自己不断前行且学习新知识:另一方面是分享与读者,希望大家一起进步.前文介绍了Go的编译运行 ...

  6. [GO语言基础] 二.编译运行、语法规范、注释转义及API标准库知识普及

    作为网络安全初学者,会遇到采用Go语言开发的恶意样本.因此从今天开始从零讲解Golang编程语言,一方面是督促自己不断前行且学习新知识:另一方面是分享与读者,希望大家一起进步.前文介绍了什么是GO语言 ...

  7. c语言程序实际问题,《编程解决问题之程序规划语言(c语言)》.doc

    <编程解决问题之程序规划语言(c语言)> <编程解决问题之程序设计语言(c语言)> 课程内容介绍: 本课程主要是介绍如何利用c程序设计语言,编写程序,解决实际问题.目的是提高学 ...

  8. 为什么会有这么多种程序设计语言?

    传说人类建造通天塔触怒上帝,上帝施法使人类语言混乱彼此之间无法交流.这就是说各种各样的语言其实就是祸乱之源--只会导致交流的不便.可是看看如今的程 序设计语言的数量,你会怀疑人类是否又在造" ...

  9. GO语言-第二节-顺序编程

    目录 2.1变量 2.1.1变量声明 2.1.2 变量初始化 2.1.3 变量赋值 2.1.4 匿名变量 2.2 常量 2.2.1 字面常量 2.2.2 常量定义 2.2.3 预定义常量 2.2.4 ...

最新文章

  1. 致力云安全服务模式 安全狗获近5000万融资
  2. Codeforces 997E Good Subsegments (线段树)
  3. 斯坦福java下载_斯坦福解析器java错误
  4. Sentinel(四)之工作主流程
  5. 装配图位置偏转怎么调整_物理微课|匀变速直线运动、电容器动态分析及磁偏转技巧、方法、模型...
  6. JEECG 缓存用法
  7. 【AI视野·今日NLP 自然语言处理论文速览 第一期】Fri, 4 Jun 2021
  8. 存储过程可重用的代码块_利用软件重用经验进行自动化测试推荐
  9. Star Schema完全参考手册读书笔记八
  10. SQL注入学习part06:(结合sqli-libs学习:51-61关)
  11. python中的深浅拷贝的区别
  12. Nginx + FastCGI架构部署指导
  13. NoSql数据库确实非常适合网站
  14. [hiho1160] 攻城略地
  15. 设有一头小母牛,从出生第四年起每年生一头小母牛,按此规律,第N年时有几头母牛?...
  16. php图文编辑,ThinkPHP整合百度Ueditor编辑器的图文教程
  17. 电脑取消撤销快捷键是什么_撤销快捷键ctrl加什么
  18. 全国全量企业工商数据分析报告1
  19. 请停止无效努力,让你的付出都能有所收获
  20. 深蓝代表的计算机应用领域是,2002年10月高等教育自学考试计算机应用基础

热门文章

  1. 全封闭主动侧倾「智能」电动车「坐骑科技」完成数千万元天使投资
  2. 哑变量的基本介绍及R语言设置
  3. 暴力美学的终极形态 JAVA Feroce 2评测
  4. 【数学】导数(Derivative)的定义、洛必达法则
  5. 拉伊达法则matlab代码,伊布专访(下):超人也有一颗温柔的心
  6. 只知道SQL数据库?又一国产数据库语言诞生了
  7. JSON 与 对象 、集合 之间的转换(转)
  8. XRuby 0.1.4发布了!
  9. Java swing 做一个传统Web项目的桌面程序启动器(内嵌浏览器)
  10. python-中文分词词频统计