目录
一、C语言简介
C语言是1971~1973年美国贝尔实验室的肯·汤姆逊和丹尼斯·里奇(C语言之父)创造的,是专门为了编写操作系统而诞生的语言,适合硬件编程,以运行速度快而著称,而且c语言适合编写数据结构和算法。C语言出现时间太早,有很多缺陷,因为没想到普通人也可以编程,但是很多前辈总结避免这些缺陷或陷阱的经验。
语言发展历程:BCPL -> New B -> C -> UNIX -> Minix -> Linux -> gcc
C语言三剑客(推荐书籍):《C陷阱与缺陷》《C与指针》《C程序设计语言》
二、C语言语法标注
C89 旧的系统中的默认标准
C99 对C语言的扩展和增强 ,需要使用C99 -std=gnu99
C11 全新的升级,但还没有开始全面使用
三、第一个C程序代码解析:hello world
#include <stdio.h>
程序员所编写的代码都不是标准c代码,需要一段程序翻译成标准c代码,负责翻译的程序叫做预处理器,翻译的过程叫做预处理。被翻译的语句叫做预处理指令,C语言中以#开头的都是预处理指令
#include 的功能是把一个头文件导入(拷贝)到当前位置中
注意:#include <xxx.h> 直接从系统指定的路径下查找并加载头文件
#include "xxx.h" 先从当前工作路径查找,找不到再从系统指定路径查找并加载
头文件:以.h结尾,存储一些辅助性代码,绝大多数都是函数的声明
源文件:以.c结尾,存储实际功能性代码
C语言标准委员会为C语言以函数形式提供的一些基础功能,这些函数都被封装在libc.so 然后通过很多的头文件对不同功能的标准库函数进行说明,stdio.h就是其中之一。常用:stdlib.h string.h
int main(){
函数是C语言中函数是管理代码的最小单位,一个函数就是一个功能的实现
main函数:程序入口也是出口,有且只有一个
int:表示main函数的执行结果是个整数
printf("hello world\n");
printf/scanf:标准库的输出和输入函数,一般用于调试代码
转义字符:键盘上有一些不好直接表示的符号,通过一些特殊的字符搭配表示,这种字符搭配就称为转义字符
转义字符 | 含义 | 转义字符 | 含义 |
\n | 换行 | \t | 制表符、Tab |
\a | 铃响 | \b | 光标后退一个字符 |
\r | 光标回到行首 | %% | 显示一个% |
\\ | 显示一个\ | printf("\b \b") | 退格效果 |
*注意:C语言是以分号作为代码结束标注,使用大括号划分代码,必须用英文输入法
return 0;}
return的作用:返回一个执行结果给函数的调用者或者提前结束函数。
通常返回值出现三种情况:1.正数 -> 出现异常(别人导致)
2.0 -> 一切正常
3.负数 ->出现错误(自己导致)
*注:main函数是由操作系统调用,所以它的返回值给了操作系统,反映程序如何结束
四、编译器说明
负责把人能看得懂的代文本文件翻译成计算机能看懂的二进制文件,由预处理器、编译器、链接器组成。
gcc编译器是GNU社区为了编译Linux内核代码而开发的一款免费的编译器,默认语法标注是C99或C89,其重用编译参数如下:
参数 | 说明 | 参数 | 说明 |
-E | 只显示预处理结果 | -S | 生成汇编文件 |
-c | 只编译不链接 | -o | 指定编译结果的名字 |
-I | 指定头文件的加载路径 -I path | -l | 指定要使用的代码库 -lm 导入数学库 |
-Wall | 尽可能多的产生警告信息 有警告但是产生可执行文件 | -Werror | 把警告当错误处理 有错误不产生可执行文件 |
-std | 设置编译语法标准 -std=gnu89/99 |
五、C代码从源文件 -> 可执行文件:
1.预处理:把源文件翻译成预处理文件
gcc -E xxx.c 显示预处理的结果到终端
gcc -E xxx.c -o xxx.i 把预处理结果存储到xxx.i预处理文件中
2.编译:把预处理文件翻译成汇编文件
gcc -S xxx.i 生成以.s结尾的汇编文件
3.汇编:把汇编文件翻译成二进制的目标文件
gcc -c xxx.s 生成以.o结尾的目标文件(里面是乱码)
4.链接:把若干个目标文件合并成一个可执行文件
gcc a.o b.o c.o ... 默认生成a.out的可执行文件
六、C语言中的文件类型
后缀 | 说明 | 参数 | 说明 |
.c | 源文件 | .o | 目标文件 |
.h | 头文件 | .h.gch | 头文件的编译结果文件 会被优先使用 |
.i | 预处理文件 | .so | 共享库文件 |
.s | 汇编文件 | .a | 静态库文件 |