前言:C语言是包含了很多编程的基本思想,理解C能够有助于理解其他高级语言,深刻理解编程很多基本思想;这对新手入门是有很多好处的,正所谓磨刀不误砍柴工,内功与基础修炼扎实了,才能开始盖高楼大厦。 这篇文字作为读书笔记摘录了C Primer Plus这本经典C语言的内容,便于知识复习与分享。推荐书籍《C Primer Plus》
第1章 初识C语言
1.1 C语言的起源
为程序员设计开发的语言,有用的语言,程序员使用的一种编程工具。
1.2 选择C语言的理由
设计特性:自顶向下的规划、结构化编程、模块化设计;
高效性:运行速度快,微调控能力(汇编语言才具有的能力);
可移植性:许多计算机体系结构都可以用C编译器;可移植语言;
强大而灵活:
C编译器的作用:就是把C语言代码转换成计算机内部指令的程序。
可移植性:不同的硬件,使用不同的机器语言,由于架构体系的不同。
汇编语言:是为特殊的中央处理单元CPU,设计的一系列内部指令,使用助记符表示。
面向程序员:许多任务用C来处理都非常简洁,但是反面就是会容易犯莫名其妙的错误;
缺点:自由,但是必须承担更多的责任;自由就必须时刻保持警惕;大量运算符,可以编写出让人费解的代码;
1.3 C语言的应用范围
小型计算机(UNIX系统)、微型计算机(PC)、大型机(庞然大物);
C语言修改方便,移植到新型号的计算机中也没什么问题。
C++是C的超集,C++在C语言的基础上,嫁接了面向对象的编程工具。
面向对象编程是一门哲学!通过对语言的建模来适应问题,而不是对问题建模来适应语言。
嵌入式编程的流行语言:许多现代化设备的微处理器上
最重要的编程语言之一!
1.4 计算机能做什么
了解计算机的工作原理!
C语言编写程序与运行程序时发生的事情之间有什么联系?
计算机的组成:1、中央处理单元(CPU)承担大部分运算工作;2、随机存取内存(RAM)是存储程序和文件的工作区;3、永久内存存储设备(机械硬盘、固态硬盘);4、各种外围设备(键盘、鼠标、显示器等等);
CPU的工作过程:来概括就是,能够以惊人的速度从事枯燥的工作!工作过程简单来讲就是,从内存中获取一条指令并执行,然后再从内存中获取下一条指令并执行。CPU有自己的小工作区,由若干个寄存器构成。每个寄存器都可以存储一个数字。CPU能够理解的指令非常有限(这些指令的集合叫作指令集)。这些指令都相当具体。
有趣的知识:
-
存储在计算机中所有内容都是数字。计算机以数字的形式存储数字和字符(每个字符都有一个数字码),计算机载入寄存器中的指令也是以数字形式存储的。
-
计算机程序最终必须以数字指令码(机器语言)来表示。
计算机的工作原理就是,希望计算机做某事,就必须为其提供特殊的指令列表(程序
),必须用计算机能直接明白的语言创建程序。这是一项繁琐、乏味、费力的任务。
1.5 高级计算机语言和编译器
高级编程语言以多种方式简化了编程工作。首先,不必用数字码表示指令;其次,使用的指令更贴近你如何想这个问题,可以在更抽象的层次表达你的想法。
但是对计算机而言,高级指令就是一堆无法理解的无用数据。编译器在这个时候排上了用场。编译器是把高级语言程序翻译成计算机理解的机器语言指令集的程序。
程序员进行高级思维活动,编译器负责处理冗长乏味的细节工作。
不同CPU制造商使用的指令系统和编码格式不同。使用合适的编译器和编译器集,便可把一种高级语言程序转换成供不同类型CPU使用的机器语言程序。
高级语言以更抽象的方式描述行为,不受限与特定的CPU或指令集。高级语言简单易学,用高级语言编程比用机器语言编程容易得多。
1.6 语言标准
1.7 使用C语言的7个步骤
编程的7个步骤:1、定义程序的目标;2、设计程序;3、编写代码;4、编译;5、运行程序;6、测试和调试程序;7、维护和修改程序;
-
定义程序的目标:明确自己想做什么,需要哪些信息,要进行哪些计算和控制,程序要报告什么信息。这个过程不涉及具体的计算机语言,应该用一般术语来描述问题。
-
设计程序:对程序应该完成什么任务有概念性的认知后,应该思考如何用程序来完成它。用户界面应该是什么样的?如何组织程序?目标用户是谁?准备花多长时间来完成这个程序?如何表示数据,用什么方法处理数据,用一个合适的方式表示信息可以更容易地设计程序和处理数据。再次强调用一般术语来描述问题,而不是用具体代码。
-
编写代码:这个过程是真正使用C语言的地方,而且取决于编程环境。文本编辑器创建源代码文件,使用C的注释工具在源代码中加入对代码的解释。
-
编译:编译的细节取决于编程的环境。从概念的角度,讲解编译发生了什么事情。编译把源代码转换成可执行代码的程序。可执行代码是用计算机的机器语言表示的代码。不同的计算机使用不同的机器语言方案。编译器还会检查C语言程序是否有效。如果发现错误就不生成可执行文件并且报错,并生成错误信息或警告信息。
-
运行程序:
-
测试和调试程序:查找和修复程序错误的过程叫调试。
-
维护和修改代码
说明:养成先规划再动手编写代码的好习惯,用笔和纸记录下程序的目标和设计框架。这样在编写代码的过程中会更加得心应手、条例清晰。
1.8 编程机制源代码文件 目标代码(中间代码)-->目标代码文件,目标文件、中间文件 启动代码--> 库函数(目标代码)-->库文件 -->
C语言编写程序时,编写的内容被储存在文本文件中,该文件被称为源代码文件(source code file),源代码文件以.c结尾。基本名.扩展名->这样的组合就是文件名。
C编程的基本策略是,用程序把源代码文件转换为可执行文件(可直接运行的机器语言代码)。C实现通过编译和链接两个步骤来完成这个过程。分而治之的方法方便对程序进行模块化。
过程:编译器把源代码转换成中间代码,链接器把中间代码和其他代码合并,生成可执行文件。可以独立编译单独模块,稍后再用链接器合并已编译的模块。如果只更改某个模块,不必因此重新编译其他模块。链接器还可以将已经编写的程序和预编译的库代码合并。
中间文件有多种形式。这里描述的是最普遍的一种形式,即把源代码转换为机器语言代码,并把结果放在目标代码文件中。目标文件(目标代码文件)存储的是编译器翻译的源代码,虽然目标文件中包含了机器语言代码,但并不能直接运行该文件,这还不是完整的程序。
目标代码文件缺乏启动代码。启动代码充当着程序和操作系统之间的接口。启动代码由于操作系统的不同而不同。
而且目标代码还缺少库函数。几乎所有的C程序都要使用C标准库中的函数。这些库函数真正的代码被存储在一个称为库的文件中。库文件中有许多函数的目标代码。
目标文件和可执行文件都是由机器语言指令组成的。目标文件只包含编译器为你编写的代码翻译的机器语言代码,可执行文件中还包含你编写的程序中使用的库函数和启动代码的机器代码。
有些系统中,编译器会自动启动链接器。用户只需要给出编译命令即可。
有些系统中,必须分别运行编译程序和链接程序。
1.8.1 Unix系统
可执行文件的扩展名.out
编译命令是cc
编译器会创建一个与源代码基本名相同的目标代码文件,扩展名是.o
但是一旦链接器生成了完整的可执行文件,就会删除.o目标代码文件。
如果原始程序有多个源代码文件,则保留目标代码文件。后面学到多文件程序时,这样做的好处你就会明白。
1.8.2 GNU编译器集合和LLVM项目
GNU项目始于1987年是一个开发大量免费UNIX软件的集合(GNU的意思是GNU’s Not UNIX,即GNU不是UNIX)。
GNU编译器集合->即GCC,其中包含 GCC C编译器是该项目的产品之一。
GCC有各种版本以适应不同硬件平台和操作系统。用gcc命令便可以调用GCC C编译器。许多使用gcc的系统都用cc作为gcc的别名。
LLVM 项目是与编译器相关的开源软件的集合。
各系统都使用cc别名来代替gcc或clang命令。
1.8.3 Linux系统
Linux是一个开源、流行、类似于UNIX操作系统,可在不同平台上(PC、MAC)上运行。准备C程序是,要使用GNU提供的GCC 公共域C编译器。
安装Linux时,可选择是否安装GCC,如果之前没有安装GCC,则必须安装。安装过程中会将cc作为gcc的别名。在命令行中使用cc来代替gcc。
1.8.4 PC的命令行编译器
C编译器不是标准Windows软件包的一部分,因此需要从别处获取并安装C编译器。可以从网上免费下载Cygwin和MinGW。这样可以再PC上通过命令行使用GCC编译器。
1.8.5 集成开发环境(Windows)
利用集成开发环境IDE可以快速开发C程序。IDE都内置了用于编写C程序的编辑器。
初次接触IDE环境可能令人望而生畏,因为它提供多个目标(target),即运行程序的多种环境。例如IDE提供了32位Windows程序,64位Windows程序,动态链接库DLL等。许多目标都涉及Windows图形界面。要管理这些选择,通常要先创建一个项目(project),以便稍后在其中添加待使用的源代码文件名。
1.9 小结
C是强大而简洁的编程语言。C语言更容易从一个系统移植到另一个系统。
C是编译型语言。C编译器和链接器把C语言源代码转换成可执行代码的程序。