这套教程将通过以下几个方面来介绍C语言编程的基础知识:

  • 准备C语言编程环境
  • 用C语言编写Hello World程序
  • 类型、操作符和表达式
  • 流程控制
  • 函数
  • 结构体
  • 指针与数组
  • 输入与输出
  • 一个典型的C语言程序结构
  • 下一步学习计划

每一章内容都会通过一些简单的例子来解释C语言的基础知识。当你学习每一个知识点时,你最好自己动手执行这些例子,以便加深理解。

为了更好更快地学习C语言,你需要准备一台电脑,推荐你使用Linux操作系统,当然,你也可以使用Mac和Windows操作系统。此外,你需要准备好C语言编程环境,下一章将会介绍,好的准备将会达到事半功倍的效果。

C语言概要

C语言流行离不开Unix操作系统的盛行。起初(大约在1960s),程序员为Unix编写程序时用的是汇编语言(Assembly Language),这种计算机语言与计算机指令集深度绑定。也就是说,将汇编语言编写好的程序放在不同计算机指令集的计算机上是无法运行的。

为了解决这个问题,C语言之父Dennis Ritchie于1972年推出了比汇编语言更优越的编程语言-C语言。它编写出来的程序不仅性能上接近汇编语言编写出来的程序,而且解决了跨计算机指令集的问题。程序员只需要编写一份C语言程序,接着使用编译器将C语言语句翻译成包含汇编指令的可执行性文件(也就是Figure 1中的第4步),而这个可执行性文件有一个专业的名称:程序(Program)

这种通过编译器来翻译高级语言的做法在日后得到了大量的使用,比如Java、C++、C#、Go、Rust等等均采用了这一方法。而这种将高级语言翻译成低级语言的过程也叫做编译(Compile)。而需要编译才能生成可执行性文件的编程语言则叫静态编程语言(Static Program Language)

随着C语言在Unix上大获成功,在1980年代,一些公司开始在不同操作系统和计算机体系结构上推出商业化版本的C语言编译器,这标记着C语言已经全面普及。在为全平台设计C语言编译器的过程中,一些公司自己加入了C语言特性,这就导致不同平台的编译器会有细微的区别。

为了统一C语言编译器,需要先统一C语言,因此ISO这个组织推出了ANSI C标准,专门用于约定C语言的特性。该标准的第一版是C90,于1990年推出,接着1999年推出了第二版修订版C99,于2011年推出了第三版修订版C11,于2018年推出了第四版修订版C17。

Figure 1 依据ANSI C标准推出不同平台上的C语言编译器,它们分别是gcc、cl和clang

Figure 1 依据ANSI C标准推出不同平台上的C语言编译器,它们分别是gcc、cl和clang

为什么学习C语言

作为编程小白,学习C语言有以下好处:

你能通过它来理解计算机是如何运行的

C语言是一种离计算机硬件很近的高级语言,但是相比其它更高级的编程语言(Python或Javascript),它需要考虑的事情更多(比如:如何动态分配计算机内存、如何创建线程、如何读写网卡等等)。正是因为这些事情,才会迫使你弄清楚计算机体系结构,进而加深你对计算机的理解。

除此之外,C语言的语法和概念相当精简,都是一些基础的编程知识(比如类型、函数、流程控制等等),这能让你聚焦于C语言依赖的底层接口-操作系统(OS)

你能通过它来建立编程思维

现代编程语言(Go、C++、C#、Java等等)几乎都会采用C语言中大部分概念。也就是说,当你掌握C语言之后再去学习其它编程语言,会有触类旁通的效果。

通过学习C语言,你会建立起函数调用、模块划分和软件分层的思维。你只要还从事软件研发的工作,那么这些思维就会日复一日地应用到研发工作中。

你能通过它来阅读优秀的开源项目

当你掌握了C语言编程技能之后,你就能阅读优秀的开源项目,学习其中的设计思想、编码风格、实践经验等等。用C语言编写的优秀程序太多了,有Linux Kernel、Nginx、zlib等等,随便学习一个,都提高你的编程技能。

你能通过它来优化程序

用C语言编写出来的程序,其执行速度很快,接近汇编语言编写出来的程序,因此它常用于解决性能慢的问题。这也是为什么一些基础软件会用C语言编写,因为基础软件往往每天会被使用成千上万次,甚至是几千万次。如果C语言能够将几千万次的计算时间压缩到1秒之内,那么会留更多的时间给上层软件。

C语言用在哪里

在现代社会中,C语言几乎出现在我们生活中的许多场景:

服务器

前面说过Unix操作系统带火了C语言,而如今各大企业在互联网上所提供的服务大部分是基于Linux或Unix。你平时刷抖音、知乎、微博、百度之类的信息服务,均是运行在Linux操作系统上。除此之外,京东、淘宝、拼多多等之类的购物平台后面也是由成千上万台Linux服务器支撑的。

智能设备

起初,C语言常用于操作系统的研发,尤其是Linux Kernel。由于C语言具有跨平台的属性,因此该内核很容易移植到各种智能设备。这些设备有手机、电视、手表等等,它们都安装了Android操作系统,这类操作系统的核心就是Linux Kernel。

基础软件

这里的基础软件是指会被其它程序依赖的组件。常见的基础软件有数据库、Web服务器、文件系统、图形引擎等等。之所以用C语言来编写基础软件,是因为它具有接近汇编语言的执行速度,而且这些基础软件通常会跨平台,除此之外,C语言的可读性也不差,因此,自然而然,C语言成为了编写基础软件的最佳选择。

桌面应用

C语言也可以用于编写桌面应用,尤其是那些对速度要求非常苛刻的桌面应用。常见的有浏览器、Adobe设计软件、Photoshop等等。浏览器之所以会用C语言编写,是因为它几乎被全世界一半以上的人使用,它太流行了以至于多花1秒的时间,就相当于全球一半以上的人就多浪费1秒。

嵌入式设备

C语言的另外一个用武之地是嵌入式设备,这些设备五花八门,常见的有车载系统、智能冰箱、智能电饭煲等等。因为C语言善于与硬件打交道,所以常常用它来操作嵌入式设备。

学习计划

C语言系列教程是为编程小白准备的,这套教程的目的是为日后的编程学习打下牢固的基础,同时更快更好地将你带入编程行业。除此之外,如果你是编程老兵,这份教程的一些知识点也能唤醒你的记忆。

C语言系列教程的内容是根据我们多年的编程经验来设定的,这样安排的内容顺序几乎适用于任何编程语言。如果你日后学习新的编程语言,不妨根据这样的顺序来学习,以便达到事半功倍的效果。

学习任何编程语言的时候,你需要准备一台电脑和准备编程环境。因此我们一开始就介绍了如何为不同的平台准备C语言编程环境,为日后编写C语言程序扫清障碍。

当你将C语言编程环境准备好之后,我们会教你如何使用C语言编写一个Hello World程序。这个程序非常简单,只包含了几行指令,但是却很经典。通过这个程序,你能了解到一些通用的计算机概念和C语言知识点。

当带领你从一个经典例子入门之后,我们会逐渐深入到C语言的基础知识,比如:类型、操作符和表达式;流程控制;函数;结构体;指针与数组;输入与输出。这些基础知识是打开编程大门的钥匙,日后你学习任何一门编程语言的时候均会遇到类似的概念,因此,你应该掌握并理解这些知识点。

最后,我们会将所学的知识付诸实践,编写一个典型的C程序,进而从中提炼出编写程序需要考虑的关键点。这些关键点非常通用,以至于当你用其它编程语言编写程序时,也不得不考虑这些关键点。

学会C语言编程只是万里长征的第一步,但是确实非常关键的一步。如果你想在编程的世界走的更远更从容,那么需要学会抓住重点和懂得取舍。因此,下一步学习计划应运而生,目的是告诉你,哪些知识是通用且必学的,而哪些知识是需要结合自己的兴趣爱好有选择性地学习的。

编程,从来都不是一个一天就能掌握的技能,它需要你耐得住寂寞、经得起折磨、日复一日的练习才能获得的技能。如果你无法忍受这些,那么很难走的久远!