第1章 C语言概述
运行环境以Dev-C++、Visual Studio 2022、MacOS命令行和Xcode为主
1.C语言的产生和发展
-
1.1 从计算机系统开始
-
人之间交流使用汉语、英语等语言,类似地,人与计算机交流也需要一种语言,即编程语言。C语言是非常经典的一门编程语言,在编译器、操作系统、硬件驱动开发等方面应用广泛
-
计算机低层由CPU、硬盘、主板、内存条、网卡等硬件组成,硬件之上是驱动程序和操作系统,在两者配合下硬件可以协同工作。应用程序安装在操作系统上,用户通过操作应用程序和操作系统来间接调用硬件资源
-
操作系统OS——驱动程序——硬件是C语言擅长的范围
![]()
-
-
1.2 编程语言发展的3个阶段
-
机器语言
- 由二进制数
0 1组成的有限序列(机器指令) - 要解释0和1的不同组合,可读性较差
- 由二进制数
-
汇编语言
- 用符号代替二进制序列,如
MOV AX, BX - 依赖计算机硬件,程序可读性有一定提升,但可移植性较差
![image]()
- 用符号代替二进制序列,如
-
高级语言
- 接近自然语言,通俗易懂
-
-
1.3 基本概念
-
计算机程序由一系列指令构成,定义指令的过程就是编程
-
C语言的前身是B语言
BCPL, Basic Combined Programming Language -
美国国家标准学会
ANSI为C语言指定了一套标准,称为ANSI C
-
2.C语言的特点
-
1.简洁紧凑、灵活方便
- C语言本身内置的32个关键字
关键字 含义 关键字 含义 关键字 含义 int 整型 float 单精度浮点型 double 双精度浮点型 char 字符型 short 短整型 long 长整型 struct 结构体 if 如果 else 否则 switch 开关 case 实例 default 默认 for 循环 while 当......时候 do 做 break 退出循环 continue 继续循环 void 空的 return 返回值 static 静态的 const 常量 sizeof 长度 signed 有符号 unsigned 无符号 for 循环 while 当......时候 do 做 typedef 类型声明 union 共用体 extern 外部变量 auto 自动变量 register 寄存器变量 enum 枚举 goto 无条件跳转 volatile 易变的 -
9种控制语句
- 选择
if else switch - 循环
while do...while for - 跳转
break continue return goto
- 选择
-
2.运算符类型丰富
- 34个运算符
-
3.数据类型丰富
-
普通类型:整型 实型 字符型
-
构造类型:数组类型 指针类型 结构体类型 共用体类型
-
-
4.结构化语言
-
主要结构成分是函数,函数即完成某项功能的一段代码
-
代码与数据分离,程序各部分除必要的信息交流外彼此独立
-
以函数的形式提供给用户调用
-
-
5.允许直接访问物理地址,可直接对硬件进行操作
- 计算机最基本的操作单元有
位 bit、字节 Byte和地址
- 计算机最基本的操作单元有
-
6.生成代码质量高,可移植性好
-
7.适用于对操作系统和系统实用程序以及需要对硬件进行操作的场合
3.两个简单的C程序
-
1.在屏幕上输出“Hello World!”
- 1.1 编写代码
// 代码1:标准写法,推荐⭐️⭐️⭐️⭐️⭐️ #include <stdio.h> int main() { // 有返回值 printf("Hello World!"); return 0; // 用于表示程序的退出状态,0表示程序正常退出,非0代表程序异常退出 } // 代码2:不推荐❌❌❌❌❌,main前方缺少返回值类型,缺少return语句 #include <stdio.h> main() { printf("Hello World!"); } // 代码3:不推荐❌❌❌❌❌,比较古老的写法 #include <stdio.h> void main() { // 无返回值 printf("Hello World!"); }- 1.2 程序拆分
#表示预处理指令,它通知编译器在对源程序编译前应做的处理工作#include命令C编译器包含某个特定文件的内容<stdio.h> 即standard input output head file标准输入输出头文件,文件中包含了函数printf()main()为主函数。每个C源程序要有且只有1个主函数,{}为函数体,内部为完成函数功能的若干条语句,每条语句后加上;表示语句结束
-
2.求两个整数的和并输出
- 2.1 编写代码
#include <stdio.h> int sum(int x, int y) { // sum()函数相当于工厂,对数据进行一系列加工处理工作 int z; z = x + y; return z; } int main() { int a,b,c; scanf("%d,%d", &a, &b ); c = sum( a, b ); // a、b相当于原材料,c相当于产品 printf("sum = %d \n", c); return 0; }-
2.2 C程序的特点
- C程序由若干函数构成,且从
main()函数开始执行,每条语句均以分号;结束。VS Studio中使用快捷键F10可验证从main()函数开始执行,如下图
![image]()
-
形如
//的注释是C++的注释风格,推荐使用;形如/*......*/的注释是C语言的注释风格,但它不支持嵌套注释,不推荐使用。注释可帮助程序员梳理思路,建议对复杂的代码添加必要的注释 -
每行可以有多条语句,一条语句也可以分写在多行上,但这并不表示可以在语句的任何位置进行换行。建议一行只写一条语句
- C程序由若干函数构成,且从
4.C程序的上机步骤
-
4.1 编译型语言
-
举例:
C语言、C++语言、Java、C#、 Go -
特征
- 代码写完后,编译器将其变成另外一个文件(如C程序链接后生成的
.exe可执行程序),然后交给计算机执行,类似全文翻译
![image]()
-
C语言源代码都是文本文件,它本身无法执行,必须通过编译器翻译和链接器链接生成二进制可执行文件后执行
-
Windows系统运行软件时若提示
xxx.dll文件缺失,这个文件就是编译后生成的
- 代码写完后,编译器将其变成另外一个文件(如C程序链接后生成的
-
-
4.2 解释型语言
-
举例:
python语言、php语言、ruby、javascript、perl -
特征
-
代码交给解释器,解释器会从上到下一行行边解释边执行,类似实时翻译/同声传译
-
出现错误时,python代码要运行到某一句才知道错误(边解释边执行),故错误之前的
print可正常打印;C语言代码因必须通过编译才能知道错误,错误会导致C源程序无法生成exe程序,进而无法执行故错误语句前方即使前方有printf也无法输出。如以下代码:
![]()
![]()
-
-
-
4.3 运行C程序的步骤
-
编辑:在IDE中编写源程序,后缀通常为
.c -
编译:用编译程序(编译器)把源程序翻译成二进制目标程序,后缀通常为
obj -
链接:将目标程序和系统的库函数及其他目标文件链接,得到可执行文件,后主通常为
.exe -
运行:运行
.exe文件得到执行结果
-
-
4.4 IDE之Dev-C++
-
特点:既可运行C源程序,也可运行C++源程序。默认保存的文件后缀名为
.cpp,C源程序要将其改为.c -
逐过程调试:执行当前行代码,但不会进入函数内部。如果当前行是函数调用,会直接执行完整个函数,将其视为一个整体步骤。当无需逐行查看函数内部逻辑时使用
-
逐语句调试:如果当前行是函数调用,执行当前行代码时会进入函数内部逐行调试。当需要检查函数内部的执行逻辑是否正确时使用
组合 含义 组合 含义 组合 含义 Ctrl + N 新建源文件 Ctrl + S 保存源文件 Ctrl + / 注释代码 Ctrl + O 打开文件 Ctrl+W 关闭源文件 F9 编译 F10 运行 F11 编译并运行 F4 创建与取消断点 F5 启动调试 F7 逐过程调试 F8 逐语句调试 -
-
4.5 IDE之Visual Studio 2022
-
特点:集成了MSVC,安装包较大,编辑器+编译器+调试器,功能强大
-
启动调试:会加载调试符号,将程序置于调试模式下运行。若代码没有断点,作用等同于编译&运行
-
开始执行不调试:不会加载调试符号,直接编译运行程序,仅生成最终结果,无法使用调试器的相关功能
组合 含义 组合 含义 组合 含义 Ctrl + N 新建源文件 Ctrl + S 保存源文件 Ctrl + / 注释代码 Ctrl + O 打开文件 Ctrl+W 关闭源文件 F9 创建与取消断点 F5 启动调试 F10 逐过程调试 F11 逐语句调试 Ctrl + F5 开始执行不调试 -
-
4.6 在线
OJ Online Judge,在网页上写代码,常用于企业招聘时笔试和面试-
IO型:所有代码自行编写完成,输入——>计算——>输出
-
接口型:只需要完成函数的编写,其他数据均已备好
-
网页代码能运行测试,因为后台有对应的结果与之进行匹配,且后台输入和输出只有数据,没有提示。因此在线OJ时,不用在输入数据和打印结果前加上printf语句打印提示
-
5.宏定义和文件包含
-
5.1 预处理
- 宏定义和文件包含都属于编译预处理命令,以
#开头,结尾部分一般不要加分号 - 预处理并非实现程序的功能,而是给C语言编译系统提供信息,通知C编译器在对源程序进行编译之前应该做哪些预处理工作
- 宏定义和文件包含都属于编译预处理命令,以
-
5.2 宏定义
- 不带参数:
#define 标识符 字符串 - 带参数:
#define 宏名(形式参数表) 字符串 - 在预编译阶段,将程序中出现的宏名替换成“字符串”的内容
// 1.简单的宏替换 #define PI 3.14159 #define AERA(r) PI*(r)*(r) AERA(3+2) ----> PI*(3+2)*(3+2) #define PI 3.14159 #define AERA(r) PI*r*(r) AERA(3+2) ----> PI*3+2*(3+2) #define PI 3.14159 #define AERA(r) PI*r*r AERA(3+2) ----> PI*3+2*3+2 #define PI 3.14159 #define AERA(r) PI*r*r AERA(5) ----> PI*5*5 总结:1.PI*(r)*(r)在数学中加不加括号区别不大,但在C语言中区标较大 2.程序执行时会根据参数进行替换,不要想当然地将3+2直接替换为5 3.替换时先将非数字部分(如案例中的"("、")"、"*")保留,然后替换掉参数部分,不要增减任意字符 // 2.复杂的宏替换:计算梯形的面积 // 说明:梯形的面积为上底加下底的乘以高除以2。设梯形的上底、下底和高分别用a、b和h表示,则面积表达式为 (a+b)*h/2.0。 #include <stdio.h> #define S(a,b,h) (a+b)*h/2.0 int main(){ double y; y=S(2, 3, 5); printf ("梯形面积=%f\n", y); return 0; } 总结:1.宏定义不是C语句,一般不在末尾加";"若有: #define PI 3.14159; #define AERA(r) PI*r*r ----> 3.14159;*r*r 会报错 2.宏名建议用大写字母表示 // 3.变式:计算圆锥体的体积 #include <stdio.h> #define PI 3.14159 #define V(r,h) PI*(r)*(r)*h/3 int main(){ double volumn; volum = V(3, 6.5); printf("圆锥的体积=%.3f\n", volumn); return 0; } 总结:1.提取面积/体积/...计算公式中的物理量(宏定义中的参数),将物理量和所求值建立表达式关系(宏定义中的字符串) 2.当涉及到除法("/")时注意整除的坑(5/2=2) - 不带参数:
-
5.3 文件包含
- 将一个源程序文件包含到另一个源程序文件中,以
#include开头 #include <文件名>-
编译系在系统指定路径下搜索尖括号中的文件
-
一般适用于包含库函数的头文件。
-
#include "文件名"-
系统首先在用户当前目录中搜索双引号中的文件。若不存在,再按系统指定路径搜索
-
一般适用于包含用户文件的头文件
-
- 将一个源程序文件包含到另一个源程序文件中,以







浙公网安备 33010602011771号