第1章 初识C语言¶
本页最后更新于 ,内容可能过时
C 程序的组成¶
示例
输出:
说明
- 一个 C 程序由预处理指令、函数定义和语句组成
main是程序入口,执行从main的第一条语句开始printf()由标准库提供,声明写在stdio.h中int main(void)中的void表示main不接收参数return 0;把退出状态交给操作系统,0 表示正常结束
常见错误
- 语句末尾漏分号
- 函数名区分大小写,
Main不是入口 - 入口函数的返回类型写成
void,标准写法是int
编译器的作用¶
说明
- 计算机只执行机器语言,即由数字码组成的指令
- 编译器把高级语言程序翻译成目标机器的机器语言
- 不同 CPU 的指令集不同,同一份源代码要经对应的编译器
- 高层写法只说明做什么,具体的取数、加法、存回由编译器展开
语言标准¶
| 标准 | 年份 | 内容 |
|---|---|---|
| K&R C | 1978 | C 程序设计第 1 版附录,未定义库 |
| C89/C90 | 1989 | ANSI 公布,1990 年 ISO 采纳,定义库 |
| C99 | 1999 | 国际化,修订缺陷,加强数值计算 |
| C11 | 2011 | 多处理器支持,部分 C99 特性可选 |
说明
- C89 与 C90 指同一标准,差别在批准机构与年份
- K&R C 只定义语言,没有定义标准库
- 并非所有编译器都完整实现 C99,部分改动需改编译设置才可用
- 教材用 ANSI C 或 ISO C 通称各版标准共有的特性
可移植性¶
说明
- 可移植指同一份源代码稍作修改或不修改即可在另一系统运行
- 针对特定硬件、显示设备或操作系统功能编写的部分通常不可移植
- 改写量最小的情况只需更换头文件中的少数几项
编程的步骤¶
七个步骤
- 定义程序目标
- 设计程序
- 编写代码
- 编译
- 运行
- 测试和调试
- 维护和修改
说明
- 前两步用一般术语描述问题,不涉及具体语言与代码
- 第 2 步要决定数据的表示方式与处理方法
- 实际过程不是线性的,后一步发现问题会回到前一步
- 跳过前两步直接写代码,程序变大后修改成本更高
源文件的命名¶
说明
- C 源文件以
.c结尾,编译系统按扩展名识别语言 - 点号前是基本名,点号后是扩展名,合起来是文件名
- UNIX 区分大小写,扩展名必须是小写
c - Windows 与 Linux 支持长文件名,老式 MS-DOS 限制基本名不超过 8 字符
- 源文件必须是文本文件,用字处理器保存时要另存为文本模式
编译与链接¶
说明
- 目标文件含编译器翻译的机器码,但不是完整程序
- 它缺启动代码与所用库函数的代码,不能直接运行
- 启动代码是程序与操作系统之间的接口,同一目标文件在不同系统需换启动代码
- 链接器只选取程序用到的库函数,与目标代码合并成可执行文件
- 分模块编译时,只改了某个模块就不必重编其他模块
常见错误
- 把目标文件当作可执行文件运行
- 只编译不链接,得不到可执行文件
调用编译器¶
说明
cc是编译命令,多数系统把它设为gcc或clang的别名cc -v显示编译器名称与版本gcc -std=c99 文件名.c按 C99 标准编译,换成c11即 C11- UNIX 下默认生成
a.out,再次编译会覆盖,需保留时先改名 - UNIX 编译单个源文件后通常删掉
.o,只留可执行文件
控制台窗口暂停¶
说明
- Windows IDE 中程序结束,控制台窗口立即关闭
- 在
return 0;前加一行getchar();,程序等一次回车再退出 - 若之前有输入,第一个
getchar()读走遗留的回车,要写两行
复习题¶
(1)对编程而言,可移植性意味着什么?
答案
完美的可移植程序是,其源代码无需修改就能在不同计算机系统中成功编译的程序。
(2)解释源代码文件、目标代码文件和可执行文件有什么区别?
答案
- 源代码文件包含程序员用编程语言编写的代码
- 目标代码文件包含机器语言代码,它不必是完整的程序代码
- 可执行文件包含组成可执行程序的完整机器语言代码
(3)编程的 7 个主要步骤是什么?
答案
- 定义程序目标
- 设计程序
- 编写程序
- 编译程序
- 运行程序
- 测试和调试程序
- 维护和修改程序
(4)编译器的任务是什么?
答案
编译器把源代码(如用 C 语言编写的代码)翻译成等价的机器语言代码,也叫目标代码。
(5)链接器的任务是什么?
答案
链接器把编译器翻译好的源代码以及库代码和启动代码组合起来,生成一个可执行程序。
编程练习¶
编程练习
你刚被 MacroMuscle 有限公司聘用,该公司准备进入欧洲市场,需要一个把英寸单位转换为厘米单位的程序(1 英寸 = 2.54 厘米)。
- 程序要提示用户输入英寸值
- 你的任务是定义程序目标和设计程序,即编程过程的第 1 步和第 2 步