一个贪财好色的程序员决定重新学C语言

在经历了一个又一个编程语言的更新换代,一个又一个框架的爆火流行与黯然失色之后,突然发现编程语言的发展与演化逐渐的遵循了某种规律与结构,与这种规律与结构最契合的编程语言,大概是C了,让我们返璞归真,重新上路。


写在前面: 时至编程语言及其框架如此丰富的今日,为什么还要学习C语言?


依我拙见,原因有二

(一)需要区分编程语言的学习模式

  1. Learn From Zero: 从0开始学起。
    譬如从今日起,你决定要开始学习武术,第一天直接学空翻显然是不现实的,鉴于武术的特殊性,只能是自下而上的金字塔学习路线,任何一套拳法或是武术动作都需要基本功“手眼身法步,精神气力功”的支持,所以只能从0开始,练好基本功。不存在半路出家的选项。
  2. Learn From Baseline:从基础线开始学习。
    基础线是一个笼统而又难懂的概念,简而言之,学习编程就是着重于眼下、当前需要完成的事而学习一种编程语言或是相关技术。如果作为一个IT行业新人,从AI(Artificial Intelligence)开始入门,起点未免有些太过出类拔萃,如果从机器语言开始学,又太过古老。从你感兴趣的点出发开始学习,继而深入前后继,温习前驱,找一个兼顾深度与广度的平衡点,所以选择了C语言。

(二)C语言的价值与意义

引用《射雕英雄传》中老顽童与郭靖的对话:“你师父洪七所练的降龙掌是外家功夫的顶尖,再练十年估计也就还是这样,难以有新的突破。但我师兄王重阳的武功可谓一步一重天,那是永无止境。”C语言正是程序员的内家功夫。就我而言,每次温习C的内容,并不是编程语言、库函数等内容上能带来新的体验,而是在机制,编程思想等方面,每次都能有新的启发,C语言兼顾了理论和实践的精髓,它保持了计算机底层逻辑的体验的同时,也兼顾了编程语言面向人的设计,综上所述,值得一学。
值得一学再学。


一切都将从C开始

C语言的起源:1972年,贝尔实验室的丹尼斯·里奇(Dennis Ritch)和肯·汤普逊(Ken Thompson)在开发UNIX操作系统时设计了C语言。

C语言的设计特性:C语言的设计理念让用户能轻松的完成自顶向下的规划,结构化编程和模块化设计。

C语言的可移植性:从学C的第一天起,会时不时的接收到“可移植”的概念,而它也仅仅是一个概念而已,很难真正的去理解何谓可移植性。或许了解过Unix/Linux内核设计详解之后,会有一丝开悟,对于可移植性有了新的认识,但很难浅显易懂的去描述这种特性,期待着各位读者在日后的编程工作中能够用心去感受,有自己的见解和体会。

C语言的缺点:成也指针,败也指针。有趣的是,有可能你在C编写中出现的错误,是用其他编程语言难以企及的错误。

/*如果你在编程中经常出现指针相关的bug,那么恭喜你,你是诸多新手中的老手*/
/*如果你在编程中出现的bug几乎都集中在指针区域,那么很遗憾,你是诸多老手中的新手*/

这里分享一下学习编程的心态:

  1. 无惧: 就深度来说,C语言诞生不过五十年光景,站在巨人肩膀上去学习C语言的时间成本远小于创造C语言花费的时间成本,所以应当树立无所畏惧的心态,相信在有限的时间内,总是可以学完学好C语言的。
  2. 敬畏:但是从广度上来讲,C语言诞生的五十年光景中,每年都有数以万计的程序员为这个编程语言赋予生命力,C语言所蕴含的能量可能是超乎你想象的。保持敬畏与尊重,参与到这数以万计之中来,找到自己的位置,才能看见自己的一片天地。

使用C语言的7个步骤(其实所有编程语言大同小异)

  1. 定义程序的目标
  2. 设计程序
  3. 编写代码
  4. 编译:涉及编译的内容可参考《计算机编译原理笔记》
  5. 运行程序
  6. 测试和调试程序
  7. 维护和修改代码

当你可以清晰的提出一个问题的时候,其实解决方案已经胸有成竹,接下来需要将抽象的思维转化为具象的软件工程化语言,此时,可以借助C语言将你所想的内容通过编程转变为各种各样的工具,而如何利用这些工具,以及使用工具和解决问题的顺序,就可以称之为当前程序的算法。其次,在编程过程中,应当明确两个思想:


“我们不生产代码,我们只是代码的搬运工”
“从哪搬?搬到哪?怎么搬?”


编程机制:目标代码文件、可执行文件和库

#include<stdio.h>
int main(void)
{int girl_friends;printf("How many girl_friends do you have?\n");scanf("%d",&girl_friends);printf("So you have %d girl_friend(s) !\n",girl_firends);return 0;
}

C编程的基本策略是,用程序把源代码文件转换为可执行文件(其中包含可直接运行的机器语言代码)。典型的C实现通过编译和链接两个步骤来完成这一过程。

Windows系统下编译过程

#mermaid-svg-ofc1usRyuUiEl55w {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ofc1usRyuUiEl55w .error-icon{fill:#552222;}#mermaid-svg-ofc1usRyuUiEl55w .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ofc1usRyuUiEl55w .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-ofc1usRyuUiEl55w .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ofc1usRyuUiEl55w .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ofc1usRyuUiEl55w .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ofc1usRyuUiEl55w .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ofc1usRyuUiEl55w .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ofc1usRyuUiEl55w .marker.cross{stroke:#333333;}#mermaid-svg-ofc1usRyuUiEl55w svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ofc1usRyuUiEl55w .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ofc1usRyuUiEl55w .cluster-label text{fill:#333;}#mermaid-svg-ofc1usRyuUiEl55w .cluster-label span{color:#333;}#mermaid-svg-ofc1usRyuUiEl55w .label text,#mermaid-svg-ofc1usRyuUiEl55w span{fill:#333;color:#333;}#mermaid-svg-ofc1usRyuUiEl55w .node rect,#mermaid-svg-ofc1usRyuUiEl55w .node circle,#mermaid-svg-ofc1usRyuUiEl55w .node ellipse,#mermaid-svg-ofc1usRyuUiEl55w .node polygon,#mermaid-svg-ofc1usRyuUiEl55w .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ofc1usRyuUiEl55w .node .label{text-align:center;}#mermaid-svg-ofc1usRyuUiEl55w .node.clickable{cursor:pointer;}#mermaid-svg-ofc1usRyuUiEl55w .arrowheadPath{fill:#333333;}#mermaid-svg-ofc1usRyuUiEl55w .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ofc1usRyuUiEl55w .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ofc1usRyuUiEl55w .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-ofc1usRyuUiEl55w .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-ofc1usRyuUiEl55w .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ofc1usRyuUiEl55w .cluster text{fill:#333;}#mermaid-svg-ofc1usRyuUiEl55w .cluster span{color:#333;}#mermaid-svg-ofc1usRyuUiEl55w div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ofc1usRyuUiEl55w :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

编译器
链接器
链接器
链接器
源代码
目标代码.obj
启动代码
可执行文件.exe
库代码

UNIX系统下编译过程

#mermaid-svg-OhkBaxoVIjtNDEwS {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-OhkBaxoVIjtNDEwS .error-icon{fill:#552222;}#mermaid-svg-OhkBaxoVIjtNDEwS .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-OhkBaxoVIjtNDEwS .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-OhkBaxoVIjtNDEwS .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-OhkBaxoVIjtNDEwS .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-OhkBaxoVIjtNDEwS .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-OhkBaxoVIjtNDEwS .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-OhkBaxoVIjtNDEwS .marker{fill:#333333;stroke:#333333;}#mermaid-svg-OhkBaxoVIjtNDEwS .marker.cross{stroke:#333333;}#mermaid-svg-OhkBaxoVIjtNDEwS svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-OhkBaxoVIjtNDEwS .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-OhkBaxoVIjtNDEwS .cluster-label text{fill:#333;}#mermaid-svg-OhkBaxoVIjtNDEwS .cluster-label span{color:#333;}#mermaid-svg-OhkBaxoVIjtNDEwS .label text,#mermaid-svg-OhkBaxoVIjtNDEwS span{fill:#333;color:#333;}#mermaid-svg-OhkBaxoVIjtNDEwS .node rect,#mermaid-svg-OhkBaxoVIjtNDEwS .node circle,#mermaid-svg-OhkBaxoVIjtNDEwS .node ellipse,#mermaid-svg-OhkBaxoVIjtNDEwS .node polygon,#mermaid-svg-OhkBaxoVIjtNDEwS .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-OhkBaxoVIjtNDEwS .node .label{text-align:center;}#mermaid-svg-OhkBaxoVIjtNDEwS .node.clickable{cursor:pointer;}#mermaid-svg-OhkBaxoVIjtNDEwS .arrowheadPath{fill:#333333;}#mermaid-svg-OhkBaxoVIjtNDEwS .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-OhkBaxoVIjtNDEwS .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-OhkBaxoVIjtNDEwS .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-OhkBaxoVIjtNDEwS .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-OhkBaxoVIjtNDEwS .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-OhkBaxoVIjtNDEwS .cluster text{fill:#333;}#mermaid-svg-OhkBaxoVIjtNDEwS .cluster span{color:#333;}#mermaid-svg-OhkBaxoVIjtNDEwS div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-OhkBaxoVIjtNDEwS :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

输入源代码
文本编辑器
源代码name.c
编译器
可执行文件a.out
输入文件名a.out运行该程序

总结:

  • C是强大而简洁的编程语言,它之所以流行,在于自身提供大量的试用编程工具,能很好地控制硬件。而且,与大多数其他程序相比,C程序更容易从一个系统移植到另一个系统。
  • C是编译型语言。C编译器和链接器是把C语言源代码转换成可执行代码的程序。
  • 用C语言编程可能费力、困难,让你感到沮丧,但是它也可以激发你的兴趣,让你兴奋、满意。希望你在愉快的学习过程中可以爱上C。

浅读C Primer Plus——C语起源相关推荐

  1. 浅读《视觉SLAM十四讲:从理论到实践》--操作1--初识SLAM

    浅读<视觉SLAM十四讲:从理论到实践>--操作1--初识SLAM 下载<视觉SLAM十四讲:从理论到实践>源码:https://github.com/gaoxiang12/s ...

  2. Redux源码全篇浅读

    本文是关于 redux(3.7.2)源代码的一些浅读 在redux源码目录中 ,可以看到以下文件目录: |-- utils/|-- warning.js //打印error |-- 1. applyM ...

  3. 机器学习论文源代码浅读:Autoformer

    原本想要和之前一样写作"代码复现",然而由于本人一开始对于Autoformer能力理解有限,参考了一定的论文中的源代码,写着写着就发现自己的代码是"加了注释版本" ...

  4. 浅读《解密社群粉丝经济学》几点观点

    浅读<解密社群粉丝经济学>几点观点 为什么会形成社群?因为在消费者主权时代,随时随地互联的移动互联网时代,每一个既弱小又能自主的个体,在信息过度的时空里,必然自发的基于某种机缘.兴趣和价值 ...

  5. 猫的计算机相关的网络语言,辟谣:猫咪的语言是喵?教你读懂“猫言猫语”,让你明白猫的内心...

    "我们一起学猫叫,一起喵喵喵~"歌词里唱的很动听,可是养过猫的主子们应该会很难引起共鸣,毕竟在家也没真的听主子们喵过多少次,兽医小明在这里辟个谣哦,猫咪的叫声可不只是喵喵叫. 猫咪 ...

  6. 浅读西瓜书(第四章)

    浅读西瓜书(第四章) 4.1基本流程 ​ 决策树,顾名思义,肯定与做决策有关.实际上决策树既可以做决策也可以做回归.在我们生活中其实也经常用到决策树的模型.比如猜数字的游戏.给出一个数字,猜想者猜测一 ...

  7. 浅读《简约之美-软件设计之道》

    浅读<简约之美-软件设计之道>     大家好,我是Lampard~     这个周末阅读了一本程序设计相关的书籍<简约之美-软件设计之道>,它原著是<The Scien ...

  8. SQL Server锁机制浅读

    SQL SERVER 锁机制浅读 内容为本人根据当前正在读的<SQL Server性能调优实战>(陈畅亮 吴一晴 著 机械工业出版社)和前辈分享的PPT,通读后的总结与汇总. 序 锁及事务 ...

  9. 教会AI“读唇术”,唇语数据功不可没

    人类对唇语的学习和研究由来已久,然而由于受经验.视线以及主观因素的影响,人类解读唇语的正确率存在不稳定性.因此让AI学会"读唇术",在很多应用场景都有着现实意义. AI" ...

最新文章

  1. python 南京大学_南京大学python课程系列笔记之python基础之第一周:走进python
  2. Python的故事_two
  3. 机器人等级考试一级教具_机器人等级考试一级之“齿轮”
  4. 华为鸿蒙OS 2.0 发布,18点18分开放源代码
  5. OJ1086: ASCII码排序(多实例测试)(C语言)
  6. 一级域名301重定向到www二级域名
  7. 一个数据科学家对商学院的建议
  8. 干货 物联网卡使用9大常见问题解惑
  9. python如何调用阿里云接口_Python调用阿里云API接口实现自定义功能【二】——DescribeInstance窗口操作...
  10. 交换机的VLAN技术
  11. 如果计算机正执行屏幕保护程序 当用户,计算机一级考试考参试题(含答案)章节一.doc...
  12. Java Web架构知识整理
  13. 打开我的计算机我的文档不见,我电脑桌面上的我的文档不见了,是什么原因造成我的文档不见了呢?是? 爱问知识人...
  14. 华硕2020年显卡_显卡涨价?2020年12月不溢价电脑装机配置推荐——华硕3070 DUAL雪豹篇...
  15. c#Winform自定义控件-目录
  16. 计算机怎么不读u盘,老司机告诉你电脑不读U盘的解决方法
  17. matlab根据数据进行降频,Ubuntu 下对CPU进行降频
  18. 网页怎么算切屏_电脑怎么切屏
  19. 分三种情况C语言编程,浅谈C语言教学的现状及几点建议.doc
  20. C#表达式目录树系列之5 –动态创建查询表达式

热门文章

  1. python装饰器和异常处理_装饰器异常处理-面向对象编程-Python教程自动化开发_Python视频教程...
  2. android8.0内置壁纸,一加手机8pro内置壁纸分享
  3. 【源码解析】StyleNeRF 之Train_encoder.py
  4. Mov文件字幕添加与播放
  5. 《码农翻身》用故事给技术加点料
  6. VUE定时器任务(每天定时12点执行)
  7. 麒麟座mini学习笔记之云端查看数据流
  8. 计算机学硕专硕数学,考研常识:五类数学的区别
  9. IE无法打开网页的问题
  10. 同时投掷两个不同面的骰子