c语言概述————【码上学C】(不定期更新)

C语言作为大学计算机类专业的第一门课程,对培养逻辑思维,深化对计算机底层原理的理解,奠定编程基础有着重要的意义。此系列参考C语言技能树,梳理重点内容,方便学习参考。

一、c语言发展史

C语言的发展史可谓波澜壮阔。20世纪70年代初,贝尔实验室为UNIX系统首次创造了C语言,它继承了B语言的优点以优化开发,并迅速成为系统级编程的重要工具。20世纪80年代,C语言实现了标准化,其跨平台和高效率的特点受到程序员的青睐,并广泛应用于嵌入式和游戏开发等领域。随着技术的进步,C语言不断发展和完善,展现出强大的生命力。今天,C语言仍然在许多领域占据着重要地位,并有着广阔的发展前景,是现代软件开发的坚实基础。

二、c语言的特点

C语言的特点主要体现在以下几个方面:

  • 语法简单、清晰、易学,即使是初学者也能立即上手。
  • 功能强大,提供了丰富的数据类型和运算符,可以灵活地表达各种算法和数据结构。
  • 高效、可移植,可直接访问硬件资源,适用于系统开发和嵌入式编程等场合。
  • 具有出色的代码结构,易于调试和维护,可以构建稳定可靠的程序。

这些特点使C语言成为编程领域广泛使用的重要语言。

三、c语言标准

C语言的标准发展时间线简述如下:

  1. 早期阶段(1972-1978年):C语言作为BCPL和B的继承者出现,主要用于编写系统软件。
  2. ANSI C标准(1979-1989):1983年,ANSI开始制定C语言标准,1989年ANSI C(又称C89或C90)发布,为C语言建立了统一的规范。
  3. C99标准(1999年):C语言的重要扩展,引入了复合字面量和变长数组等新特性,提高了C语言的表达能力。
  4. C11标准(2011年):进一步发展和优化了C语言,支持多线程和泛型等功能,并修复了以前版本中存在的问题。
  5. 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的可执行程序文件。

链接器将多个目标文件合并为一个可执行文件,将所有函数和数据段放在一个地址空间中,并解决函数之间的调用关系,以便程序能正确执行。


 

  • 29
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值