跳转至

第1章 初识C语言

本页最后更新于 ,内容可能过时

C 程序的组成

程序结构

#include <stdio.h>
int main(void)
{
    语句;
    return 0;
}

示例

#include <stdio.h>
int main(void)
{
    printf("Concrete contains gravel and cement.\n");

    return 0;
}

输出:

Concrete contains gravel and cement.

说明

  • 一个 C 程序由预处理指令、函数定义和语句组成
  • main 是程序入口,执行从 main 的第一条语句开始
  • printf() 由标准库提供,声明写在 stdio.h 中
  • int main(void) 中的 void 表示 main 不接收参数
  • return 0; 把退出状态交给操作系统,0 表示正常结束

常见错误

  • 语句末尾漏分号
  • 函数名区分大小写,Main 不是入口
  • 入口函数的返回类型写成 void,标准写法是 int

编译器的作用

示例

total = mine + yours;

说明

  • 计算机只执行机器语言,即由数字码组成的指令
  • 编译器把高级语言程序翻译成目标机器的机器语言
  • 不同 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 通称各版标准共有的特性

可移植性

编译过程

源代码 → 改用目标系统的编译器 → 可执行程序

说明

  • 可移植指同一份源代码稍作修改或不修改即可在另一系统运行
  • 针对特定硬件、显示设备或操作系统功能编写的部分通常不可移植
  • 改写量最小的情况只需更换头文件中的少数几项

编程的步骤

七个步骤

  1. 定义程序目标
  2. 设计程序
  3. 编写代码
  4. 编译
  5. 运行
  6. 测试和调试
  7. 维护和修改

说明

  • 前两步用一般术语描述问题,不涉及具体语言与代码
  • 第 2 步要决定数据的表示方式与处理方法
  • 实际过程不是线性的,后一步发现问题会回到前一步
  • 跳过前两步直接写代码,程序变大后修改成本更高

源文件的命名

示例

budget.c

说明

  • C 源文件以 .c 结尾,编译系统按扩展名识别语言
  • 点号前是基本名,点号后是扩展名,合起来是文件名
  • UNIX 区分大小写,扩展名必须是小写 c
  • Windows 与 Linux 支持长文件名,老式 MS-DOS 限制基本名不超过 8 字符
  • 源文件必须是文本文件,用字处理器保存时要另存为文本模式

编译与链接

编译与链接过程

编译器:源文件.c → 目标文件.o
链接器:目标文件.o + 启动代码 + 库代码 → 可执行文件

生成的文件

inform.c  inform.o  a.out                 # UNIX
concrete.c  concrete.obj  concrete.exe    # Windows

说明

  • 目标文件含编译器翻译的机器码,但不是完整程序
  • 它缺启动代码与所用库函数的代码,不能直接运行
  • 启动代码是程序与操作系统之间的接口,同一目标文件在不同系统需换启动代码
  • 链接器只选取程序用到的库函数,与目标代码合并成可执行文件
  • 分模块编译时,只改了某个模块就不必重编其他模块

常见错误

  • 把目标文件当作可执行文件运行
  • 只编译不链接,得不到可执行文件

调用编译器

命令形式

cc 文件名.c

示例

cc inform.c
./a.out

输出:

A .c is used to end a C program filename.

说明

  • cc 是编译命令,多数系统把它设为 gcc 或 clang 的别名
  • cc -v 显示编译器名称与版本
  • gcc -std=c99 文件名.c 按 C99 标准编译,换成 c11 即 C11
  • UNIX 下默认生成 a.out,再次编译会覆盖,需保留时先改名
  • UNIX 编译单个源文件后通常删掉 .o,只留可执行文件

控制台窗口暂停

示例

getchar();

说明

  • Windows IDE 中程序结束,控制台窗口立即关闭
  • 在 return 0; 前加一行 getchar();,程序等一次回车再退出
  • 若之前有输入,第一个 getchar() 读走遗留的回车,要写两行

复习题

(1)对编程而言,可移植性意味着什么?

答案

完美的可移植程序是,其源代码无需修改就能在不同计算机系统中成功编译的程序。

(2)解释源代码文件、目标代码文件和可执行文件有什么区别?

答案
  • 源代码文件包含程序员用编程语言编写的代码
  • 目标代码文件包含机器语言代码,它不必是完整的程序代码
  • 可执行文件包含组成可执行程序的完整机器语言代码

(3)编程的 7 个主要步骤是什么?

答案
  1. 定义程序目标
  2. 设计程序
  3. 编写程序
  4. 编译程序
  5. 运行程序
  6. 测试和调试程序
  7. 维护和修改程序

(4)编译器的任务是什么?

答案

编译器把源代码(如用 C 语言编写的代码)翻译成等价的机器语言代码,也叫目标代码。

(5)链接器的任务是什么?

答案

链接器把编译器翻译好的源代码以及库代码和启动代码组合起来,生成一个可执行程序。

编程练习

编程练习

你刚被 MacroMuscle 有限公司聘用,该公司准备进入欧洲市场,需要一个把英寸单位转换为厘米单位的程序(1 英寸 = 2.54 厘米)。

  • 程序要提示用户输入英寸值
  • 你的任务是定义程序目标和设计程序,即编程过程的第 1 步和第 2 步