C语言介绍
丹尼斯·里奇和肯·汤普森于1971~1973在贝尔实验室,开发UNIX操作系统时,以BCPL(Basic Combined Programming Language)语言为基础研发的一款高级编程语言,它是为了编写操作系统而开发的一款编程语言,也是世界上第一款高级编程语言。
优点:语法简单,只有32个关键字,运算速度快,适合实现底层的算法,一般应用于嵌入式开发。
缺点:难以精通,有一些陷阱和缺陷,没有大型的软件公司在背后支持,可用的软件库比较少。
第一个C程序
#inclue<stdio.h>
int main(int agrc,const char* argv[])
{
printf("Hello,World!\n");
return 0;
}
注意点:
-
程序员所编写的代码不是标准C代码,它需要一段程序把它翻译成标准的C代码,负责翻译的程序就叫做预处理器,被翻译的指令叫预处理指令,在C语言中以#开头的都是预处理指令。
-
#include 的功能是导入一个文件,它有两种用法:
#include < > 从系统指定的路径查找并导入头文件
#include " " 先从当前路径下查找头文件,如果找不到再在系统指定的路径中查找并导入头文件
-
C语言标准委员会为C语言提供了一些基础功能,这些功能以函数形式被封装在libc.so库文件中,同时还提供了一些对函数的说明文件(头文件),常用的头文件有:stdio.h stdlib.h string.h math.h。
-
C语言中以main函数作为程序的执行入口,有且只能有一个,无论在哪里它都第一个执行。
-
int 是一种数据类型,作为main函数的返回值的类型,这里表示返回值为整数。
-
C语言中使用 { }大括号划分代码区域,写在大括号中的代码都属于main函数。
-
scanf 和printf 是标准库中的函数,具有输入、输出的功能,一般用于调试程序。
-
C语言中把一些不方便显示或使用的字符用一些特殊字符(转义字符)来代替:
-
C语言使用 “ ; ” 分号作为一行代码结束的标志,因此过长的代码可以换行书写,只要不加分号就行。
-
return 语句可以结束函数的执行,main函数中的return可以结束整个进程,并返回一个数据给函数的调用者(操作系统),用来告诉操作系统程序的结束状态。
结束状态:
正值:程序执行过程中出现异常(不跟程序有关)
0 :表示一切正常
负值:程序执行过程中发现错误(与程序有关)
echo $? 可以查看程序的结束状态
编译器和GCC
编译器:它负责翻译一个程序,它可以把人类能看懂的代码翻译成计算机能看懂的二进制指令,它是预处理器、编译器、链接器等的集合。
GCC是GNU组织为了编译Linux内核代码而为C语言开发的一款开源编译器。
编译器把C代码编译成可执行程序的过程:
-
把程序员所编写的C代码翻译成标准的C代码
gcc -E hello.c 把预处理结果显示在屏幕上
gcc -E hello.c -o hello.i 把预处理的结果输出到文件中
-
把预处理的结果翻译成汇编代码
gcc -S hello.i 会生成以.s结尾的汇编文件
-
把汇编代码翻译成二进制指令
gcc -c hello.s 会生成以.o结尾的目标文件
-
把若干个目标文件合并成可执行文件
gcc a.o b.o c.o ... 默认会生成一个a.out 的可执行文件,可以使用 -o指定可执行文件的名字。
注意点:gcc hello.c 包含了以上者四个步骤,通过 ./a.out 执行可执行文件,也可以用gcc hello.c && ./a.out 编译并执行。
gcc编译器常用的参数:
-E | 预处理 |
-S | 生成汇编代码 |
-c | 生成目标文件 |
-o | 指定输出文件名 |
-I(大写的i) | 指定头文件的路径 |
-l | 指定库名,例如:sqrt、pow 需要额外链接数学库 -lm |
-L | 指定库文件的路径 |
-D | 编译时定义宏 |
-g | 编译时添加调试信息,这样编译出的可执行文件可以用JDB调试 |
-Wall | 显示所有警告信息 |
-Werror | 把警告当错误处理,并且如果编译时有错误则不产生可执行文件 |
-std | 指定编译器遵循的语法标准,如:c89,c99,c11 ,当前系统默认为c89 std=gnu99 |
C语言的文件类型
.h | 头文件 |
.c | 源文件 |
.i | 预处理文件 |
.o | 目标文件 |
.s | 汇编文件 |
.gch | 头文件的编译结果,一般不使用,建议立即删除 |
.a | 静态库文件 |
.so | 动态库文件 |