C语言作为大学计算机类专业的第一门课程,对培养逻辑思维,深化对计算机底层原理的理解,奠定编程基础有着重要的意义。此系列参考C语言技能树,梳理重点内容,方便学习参考。
一、c语言发展史
C语言的发展史可谓波澜壮阔。20世纪70年代初,贝尔实验室为UNIX系统首次创造了C语言,它继承了B语言的优点以优化开发,并迅速成为系统级编程的重要工具。20世纪80年代,C语言实现了标准化,其跨平台和高效率的特点受到程序员的青睐,并广泛应用于嵌入式和游戏开发等领域。随着技术的进步,C语言不断发展和完善,展现出强大的生命力。今天,C语言仍然在许多领域占据着重要地位,并有着广阔的发展前景,是现代软件开发的坚实基础。
二、c语言的特点
C语言的特点主要体现在以下几个方面:
- 语法简单、清晰、易学,即使是初学者也能立即上手。
- 功能强大,提供了丰富的数据类型和运算符,可以灵活地表达各种算法和数据结构。
- 高效、可移植,可直接访问硬件资源,适用于系统开发和嵌入式编程等场合。
- 具有出色的代码结构,易于调试和维护,可以构建稳定可靠的程序。
这些特点使C语言成为编程领域广泛使用的重要语言。
三、c语言标准
C语言的标准发展时间线简述如下:
- 早期阶段(1972-1978年):C语言作为BCPL和B的继承者出现,主要用于编写系统软件。
- ANSI C标准(1979-1989):1983年,ANSI开始制定C语言标准,1989年ANSI C(又称C89或C90)发布,为C语言建立了统一的规范。
- C99标准(1999年):C语言的重要扩展,引入了复合字面量和变长数组等新特性,提高了C语言的表达能力。
- C11标准(2011年):进一步发展和优化了C语言,支持多线程和泛型等功能,并修复了以前版本中存在的问题。
- C23标准(最新版本):C语言的最新标准,引入了许多新功能和改进,如可空类型、异常处理、更严格的类型检查、模块化编程、更强大的标准库和更好的内存管理。
四、c语言的编程机制※(重)
c语言从源码到可执行程序,主要经历预处理,编译,汇编和链接四个阶段。
给出一段示例代码,跟踪其每步变化以更直观地了解C的编程机制:
test.h
/*
这是头文件
*/
char* p = "April";
int i = 0;
test.c
#include "test.h"
// define xxm
#define XXM "Hello world!"
#define INC(x) x++
// End
int main()
{
p = XXM;
INC(i);
}
1、预处理
示例:
gcc -E test.c -o test.i
输出:
char* p = "April";
int i = 0;
int main()
{
p = "Hello world!";
i++;
}
处理注释,宏以及以#开头的内容。
具体的处理过程为:将所有的注释,以空格代替;#define删除并展开所有的宏定义;处理条件编译指令#if,#ifdef,#elif,#else,#endif;处理 #include,展开被包含的文件;保留编译器需要使用的 #pragma 指令。
2、编译
示例:
gcc -S test.i -o test.s
输出:
.file "test.c"
.section .rodata
.LC0:
.string "April"
.LC1:
.string "Hello world!"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movl $0, -4(%rbp)
leaq .LC1(%rip), %rax
movq %rax, -16(%rbp)
movl -4(%rbp), %eax
addl $1, %eax
movl %eax, -4(%rbp)
leave
.cfi_def_cfa_offset 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0"
.section .note.GNU-stack,"",@progbits
进行词法、语法、语义的分析,生成汇编代码。
具体为:
词法分析:分析关键字,标示符,立即数等是否合法;
语法分析:分析表达式是否遵循语法规则;
语义分析:在语法分析的基础上进一步分析表达式是否合法;
分析结束后进行代码优化生成相应的汇编代码文件。
3、汇编
示例:
gcc -c test.s -o test.o
结果:输出汇编后的 .o(对象文件)结果是二进制格式的,不适合直接展示为文本。故此处不给结果。
汇编代码翻译成机器码,也就是将汇编代码转换成CPU可以直接执行的指令。
4、链接
示例:
gcc test.o
生成a.out的可执行程序文件。
链接器将多个目标文件合并为一个可执行文件,将所有函数和数据段放在一个地址空间中,并解决函数之间的调用关系,以便程序能正确执行。