gcc的使用
1、计算机能识别的唯一语言是机器语言
语言的发展:
机器语言 | 二进制数据,11010101 |
---|---|
汇编语言 | 用 符号 表示一组操作 add call mov 直接操作硬件速度快 |
高级语言 | 以 语句 为单位进行操作 ===> 可移植 |
C语言是中级语言,具体汇编的特性,同时也具备高级语言可移植等特性。 不管什么语言,要想被计算机执行,必须转换成机器码
编译器:将原来的代码(源代码)编译成计算可执行的代码(程序)
相同的代码经过不同的编译器编译,可以被不同的设备所执行
Linux系统常用的编译C语言的编译器是:gcc
2、C语言程序编译步骤
预处理(预编译) | 处理 “#” 开头的内容,进行替换、去掉注释。。。。s | 生成预处理文件,后缀名是.i |
---|---|---|
编译 | 编译器对代码进行编译 ----> 最复杂、耗时最长的过程 | 生成汇编文件,后缀名.s |
汇编 | 把汇编文件编译二进制目标文件 | 生成目标文件,后缀名是.o |
链接 | 把多个目标文件按照一定规则整合成一个可以执行的程序 | 生成的是最终的可以运行的程序 |
3、gcc的命令
gcc -E | 对文件进行预处理,生成预处理文件 |
---|---|
gcc -S | 对文件进行编译,生成汇编文件 |
gcc -c | 对文件进行汇编,生成目标文件 |
gcc -o | 给生成的文件重新命名 |
gcc 默认生成的文件 文件名是 a.out
如果想自定义生成的文件名,编译的时候加-o 后面加名字
4、程序执行
linux下执行程序,直接在终端敲文件名(带上路径,相对路径或者绝对路径)
./a.out | |
---|---|
./ 不是命令,是相对路径的写法,代表当前目录 | 绝对路径写法 |
hello world
1、头文件的包含方式
#include <stdio.h> | 默认是从 /usr/include/ 目录下搜索文件 |
---|---|
#include “stdio.h” 和 #include “…/stdio.h” | 先在当前目录下搜索文件,如果没有,再去 /usr/include 下找 |
2、stdio.h
C语言的标准输入输出头文件
3、main
1、有返回值,返回值是int 类型,用来表示程序结束状态,如果是程序是正常结束 返回 0,异常结束,返回其他值
2、c语言有且仅有一个main函数
3、程序main函数开始执行
4、{} 代码块
5、return 表明函数结束,下面的部分都不执行
6、printf () 是 stdio.h 文件中的一个函数,所以使用这个函数必须包含stdio.h 头文件
7、注释
// | 单行注释 |
---|---|
/**/ | 多行注释 |
8、多行注释
1、“{” 下面一行内容和这个“{”要有4个空格的缩进
2、单词要有空格
3、不同的逻辑代码之间要有空行
9、C语言语句是以分号结尾
内存
程序:
没有运行的程序 | 就是一堆代码,存在存储设备中,比如:硬盘、U盘、手机…. |
---|---|
运行起来的程序 | 程序会被读到内存中执行,内存中存改程序的可执行代码、数据…. |
存储单位:
bit | 位,比特,是一个二进制数字,只能表示0 或者 1,使用的单位是 b |
---|---|
Byte | 字节,使用的单位是 B 1B = 8b ====> 是内存的最小存储单位 |
KB | 1KB = 1024B |
MB | 1MB = 1024KB |
GB | 1GB = 1024MB |
内存最小的存储单位是字节,如何管理?
内存为每个字节分配了一个编号,类似于人的身份证号===> 这个编号叫做内存的地址
编号? ===> 是一个数字 ====> 是否有范围??
身份证号是多少位? 18位,位数是固定的
内存为字节分配编号,要统一编号,这个编号的位数也是固定的
32位系统 | 编号的位数是32位 进制是二进制 000001…… 10101010(32个) ==> 4B |
---|---|
64位系统 | 编号的位数是64位 进制是二进制 000001…… 10101010(64个) ==> 8B |
32位系统 ===> 内存编号是4字节编号 ==> 最大能有多少个字节?
范围: 0000…00000(32个0) -----> 1111….1111(32个1)
0----->2的32次方-1
总共2的32次方字节4GB
数据存储
内存存的是二进制数据,以1个字节为例:
1、无符号数:只有正数,不带正负号
范围: 0000 0000 -----> 1111 1111
0 -------> 255
2、有符号数:带正负号的数
内存取最高位为符号位
最高位 | 类型 |
---|---|
0 | 正数 |
1 | 负数 |
存:
正数在内存中的存的数据本身
负数:先转换成二进制,对每一位取反(符号位不变),然后加1
比如:
5: 实际在内存中存的值是 0000 0101
-5: 1000 0101(-5)===> 1111 1010(取反) ===> 1111 1011(+1)
实际在内存中存的值是1111 1011
0在内存中表示 :0000 0000
-0在内存中表示:人为规定-0 就是 -128
就是说 1000 0000 这个值表示 -128
有符号数取值范围:1000 0000 ---- 01111 1111
-128 ---- 127
有符号数,在一个字节范围内:
127+1
127在内存中的存储:0111 1111
1 在内存中的存储:0000 0001
和 : 1000 0000 =====> -128
1111 1111 代表 -1