C 语言学习指南


前言

又到一年开学季,想到又有部分同学要一边吐槽 “C 语言好难”,“写代码好烦”,一边在那些早已过时的教学资料中踩坑,最后不明不白地结束这门课程,我的心情复杂了起来。C 作为众多学校计算机专业所教授的第一门语言,对于学生今后的意义十分重要。然而计算机行业的发展日新月异,许多在学校传授的知识往往无法同步社会的实际需求。如果贵校的老师还在用 VC 6.0 + 谭浩强的话,我想你可以看一下这篇文章,可以使你不至于和行业脱轨太远。

值得一提的是,今年恰好是 C 语言诞生的 50 周年(1972 ~ ),作为一个诞生于半个世纪前的编程语言,它依然经久不衰,用来作为第一门学习的编程语言完全没必要担心过时。

小测试

在学习 C 语言之前先做一个小测试:

  1. 计算机如何表示数字?他们的运算方式又是什么?
  2. 计算机如何存储文本?图像、音频、视频这种类型的数据呢?
  3. 计算机由哪几部分组成?他们之间又有什么联系?

现实地讲,C 语言学习的前置条件是对整个计算机系统有一个基础的认识,如果没有这个条件,深入学习 C 语言将是一件很困难的事情,许多同学吐槽难不是因为在计算机方面没有天赋,而是他们没有准备好。所以如果你完全不知道上面问题的答案的话,那么你需要学习一下计算机科学导论的一些基础内容。

学习过程

我们学 C 语言到底是在学什么?只是教材目录上的内容吗?答案并不是这样的,我也曾有这个狭隘的观点,致使我花费了很多时间去关注些琐碎的细节,结果迟迟不能接触到真正重要的知识。

  1. 学习基础语法:编程语言的「语法」往往是教材中着重强调的内容,比如数据类型,变量,if-else 分支判断,forwhiledowhile 循环语句,函数,递归,指针等,幸好这些内容并不是很难,基本都是些形式化的东西,语法只是一种规范,一个约定,在实际的软件工程中,更重要的其实是「函数库」和「库函数」。

通俗地说,编程语言的函数库就是一些事先写好的函数的集合,供他人使用。库函数则是函数库中的某一个函数。而标准库是该语言的每种实现中都按例提供的库。

  1. 学习必要的标准库函数:比如 printf(char *fmt, ...) 就是一个标准库函数,它在标准库头文件 stdio.h 中定义。你并不知道 printf 内部的工作原理是什么,但是如果让你打印 hello, world! 你按照函数的规定去调用它就可以达到你想要的目的。这便是「抽象」,计算机科学中最重要的概念之一。

  2. 学习程序设计的基础知识:程序设计的一般步骤,一些基础的数据结构与算法等。

  3. 学习更多更强大的标准库函数:入门教程涉及的标准库函数十分有限,还有很多强大的标准库函数要学习。

  4. 学习一些特定应用领域的基本理论知识:进一步学习数据结构与算法,学习操作系统、计算机网络、图像处理、计算机图形学、密码学等理论知识。

  5. 学习如何应用上一阶段的知识进一步学习第三方函数库:除了标准库以外,第三方函数库更是数不胜数,从文件压缩,加密解密,到网络层通信,再到人工智能等等,这些库函数的数量和重要程度远远超出你的想象。

对于我们本科的学生来说,必须做好 1-4 ,5-6 可以选择性学习,如果能做出一些小项目,就已经非常不错了。这就是编程语言学习的一般规律,说的很简洁,认真落实非常不容易。

其实不仅仅是 C 语言,其他程序设计语言亦可以按以上步骤去学习。

课程资源及参考教材

公开视频课程

CS50’s Introduction to Computer Science (CS50x)

Introduction to the intellectual enterprises of computer science and the art of programming. This course teaches students how to think algorithmically and solve problems efficiently.

程序设计入门 —— C 语言 by 翁恺 (2022)

本课程是零基础的编程入门课,是后续的操作系统、编译原理、计算机体系结构等课程的基础。

国际权威教材

计算机科学概论 第12版

计算机科学概论课程的经典教材,全书对计算机科学做了百科全书式的精彩阐述,充分展现了计算机科学的历史背景、发展历程和新的技术趋势。本书首先介绍的是信息编码及计算机体系结构的基本原理,进而讲述操作系统和组网及因特网,接着探讨算法、程序设计语言及软件工程,然后讨论数据抽象和数据库方面的问题,讲述图形学的一些主要应用以及人工智能,以计算理论的介绍结束全书。

C 语言程序设计:现代方法 第2版·修订版 by K.N.King (2022)

时至今日,C 语言仍然是计算机领域的通用语言之一,但今天的 C 语言已经和最初的时候大不相同了。本书主要目的是通过一种“现代方法”来介绍 C 语言,书中强调标准 C 和软件工程,不再强调“手工优化”。本书是 C 开发人员的理想参考书,在国外也被众多大学作为 C 语言课程的教材。

C Primer Plus 第6版 中文版 by Stephen Prata (2022)

本书详细讲解了 C 语言的基本概念和编程技巧,可作为 C 语言的教材,适用于需要系统学习 C 语言的初学者,也适用于想要巩固 C 语言知识或希望进一步提高编程技术的程序员。

Effective C by Robert C. Seacord (2020)

The world runs on code written in the C programming language, yet most schools begin the curriculum with Python or Java. Effective C bridges this gap and brings C into the modern era—covering the modern C17 Standard as well as potential C2x features. With the aid of this instant classic, you’ll soon be writing professional, portable, and secure C programs to power robust systems and solve real-world problems.

Modern C by Jens Gustedt (2019)

Modern C focuses on the new and unique features of modern C programming. The book is based on the latest C standards and offers an up-to-date perspective on this tried-and-true language.

该书的免费版可以在 HAL-Inria 下载,作者对其最后的修改日期是 2021.09.05 。

在线网络文档

标准库

GNU C 标准库手册

The GNU C Library Manual

C 代码标准与风格

GNU 代码标准

GNU Coding Standards

Linux 内核代码风格

Linux kernel coding style

编辑器与集成开发环境

Dev-C++

Code::Blocks

Visual Studio

Visual Studio Code

参考

学习 C 语言基本思路与参考书籍 by 林建入 (2014)

C 语言学习的经典书籍有哪些? by 顾露 (2015)