首页 > 其他分享 >为什么要学习和使用 C 语言?

为什么要学习和使用 C 语言?

时间:2022-09-28 21:32:09浏览次数:76  
标签:为什么 语言 编程 运算符 C++ 学习 3.2 操作系统


一、前言

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

 

二、C 语言

  ​​C 语言​​​是由美国 AT&T 贝尔实验室的研究员 ​​Dennis Ritchie​

​TIOBE​

为什么要学习和使用 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 语言?_编程语言_02

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++ 代码编译出来需要更多的指令来运算地址,导致性能下降了太多。


​GUI​​​ 编程,这是 C++ 的传统强项,我一直坚持 C 也能优雅的做出图像和动画,但开发效率确实较 C++ 低很多,最近有个很火的 ​​RUST​


 


四、总结


  下面我列举了 10 多个目前热门的发展方向,粗略的介绍了下列项目里最常用的编程语言:

为什么要学习和使用 C 语言?_杂谈_03


由上图可知,操作系统、编译原理、数据结构与算法等等基础知识,是深入理解、掌握和灵活运用 C 的重要前提,现阶段程序员职业生涯超过一半的热门方向直接或间接与 C 有关,我想,学好 C 的重要性也就不言而喻了。





标签:为什么,语言,编程,运算符,C++,学习,3.2,操作系统
From: https://blog.51cto.com/u_3002289/5720965

相关文章

  • gogogo语言的学习
    Sprint&SprintfSprint使用其操作数的默认格式格式化并返回结果字符串。当两者都不是字符串时,在操作数之间添加空格。//Sprintformatsusingthedefaultformatsf......
  • Go语言图形界面开发:Go版GTK
    初识GTK​​01、GUI概述​​​​02、GTK简介​​​​03、环境搭建(windows)​​Go语言快速入门​​04、Go入门教程​​HelloGTK​​05、一个简单的空白窗口​​​​06、控......
  • C语言也能做界面:踏上GTK+学习之旅
    ​​00、背上行囊1——程序员学习之道​​​​01、背上行囊2——为什么要学习GTK​​​​02、背上行囊3——​​​​GUI概述​​​​03、背上行囊4——GTK简介​​​​04、......
  • Go语言版黑白棋(十一):机器落子
    功能说明机器为白子。机器优先在4个角落落子,如果这4个位置不能吃子,则落在能吃子最多的位置。示例代码packagemainimport("fmt""os""strconv""unsafe"......
  • Go语言版黑白棋(十):棋子个数统计、胜负判断
    功能说明增加棋子个数统计、胜负判断功能,游戏结束后可选择继续游戏。示例代码packagemainimport("fmt""os""strconv""unsafe""github.com/mattn/go-g......
  • Go语言版黑白棋(九):吃子
    功能说明增加吃子规则算法。在一个空格新落下一个棋子,并且翻转对手一个或多个棋子,落子必须要吃子。原理说明示例代码packagemainimport("fmt""os""strconv"......
  • Go语言版黑白棋(八):倒计时
    功能说明通过定时器实现倒计时功能,时间为20s,时间到后,如果没有落子,让对方下。示例代码packagemainimport("fmt""os""strconv""unsafe""github.com/mat......
  • Go语言版黑白棋(六):落子
    功能说明鼠标点击棋盘方格,落子。需要使用鼠标事件,棋子通过绘图事件画的。原理说明通过二维数组标志棋盘:示例代码packagemainimport("fmt""os""unsafe""g......
  • Go语言版黑白棋(四):界面其它设计
    功能说明界面上增加3个标签,分别用于显示黑白子棋子个数,还有一个用于显示倒计时的时间。还增加2个图片控件,用于提示该谁落子(当前该黑子下,还是白子下)。glade界面设计示例代码p......
  • Go语言版黑白棋(五):黑白子提示闪烁效果
    功能说明通过定时器,实现黑白子提示闪烁效果。大致流程是这样,定时器每隔500毫秒产生一次信号,调用其处理函数,函数里做这样的事情,如果image原来是显示的,则隐藏,原来是隐藏的,则显......