gcc编译器:
1. 编译hello.c文件默认生成a.out文件
gcc hello.c
2. 编译分为4个流程步骤:
1.预处理:
将C语言代码展开(处理程序中与#号相关的代码)
#include <stdio.h>
将头文件stdio.h展开到代码中
#if
#elif
#else
#endif
#ifndef
#ifdef
根据条件编译规则将符合条件的代码加入到编译中,不符合条件的代码从编译中去除
#define
宏完成替换
gcc -E hello.c -o hello.i
2.编译:
将C语言代码编译成汇编代码
gcc -S hello.c -o hello.s
3.汇编:
将汇编代码编译成二进制代码
gcc -c hello.c -o hello.o
4.链接:
将二进制代码链接成为可执行程序
gcc hello.c -o hello
3. 程序错误:
1.语法错误
1.每次编译代码都寻找第一个错误并修改,直到错误完全解决为止
2.错误分为:error、warnning
error:无法生成可执行程序
warning:可以生成可执行程序,但程序中有可能出现错误
2.逻辑错误
1.加入打印解决问题
2.gdb调试器
gdb调试器:
1.编译代码时必须加-g选项,允许GDB调试
gcc filename.c -g
2.使用gdb调试代码
gdb ./a.out
3.输入命令完成GDB调试
l 查看代码
b 函数名/行号 设置断点
r 运行代码
n 单步执行
c 继续执行到下一个断点
p 变量名 查看变量值
s 进入函数内部调试
q 退出
查看代码 -> 设置断点 -> 运行代码 -> 单步执行
人工智能
========================================================================================================
C语言:
基础部分:
1. 基本数据类型、运算符、表达式
2. 常用的输入输出函数
3. 流程控制
重点部分:
4. 数组
5. 函数
6. 指针
进阶部分:
7. 构造数据类型
8. 内存管理
9. 链表
1. 进制转换:
二进制、八进制、十进制、十六进制
二进制:逢二进一
0、1
八进制:逢八进一
0、1、2、3、4、5、6、7
十进制:逢十进一
0、1、2、3、4、5、6、7、8、9
十六进制:逢十六进一
0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f
二进制、八进制、十六进制 -> 十进制:
对应位 * 对应位的权值再求和
十进制 -> 二进制、八进制、十六进制:
十进制数除以进制数得到的余数逆序排列
十进制 <-> 二进制
二进制 <-> 八进制、十六进制
八进制的1位 == 二进制的3位
十六进制1位 == 二进制的4位
2. 负数在内存中的存储
100 1100100
-100
负数在内存中存储:
1.先获得原码(去掉符号位,数字对应的二进制形式)
2.获得反码 (原码取反)
3.获得补码(反码+1)
4.获得内存中的值(符号位+补码)
3. 程序在计算机内部如何运行:
存储器:
1.内存
读写速度快
价格昂贵
掉电数据丢失
2.外存
读写速度慢
价格便宜
掉电数据不丢失
外存存储文件
a.out是存放在外存中的一个文件
./a.out时将该文件加载到内存中运行,内存负责与CPU交互执行代码内的运算处理
4.计算机内存的存储单位:
1 bit
1 byte == 8 bit
1 kb == 1024 byte
1 mb == 1024 kb
1 gb == 1024 mb
1 tb == 1024 gb
基本数据类型、运算符、表达式:
1.数据类型:
1.基本数据类型
整数类型
浮点数类型
字符型
缺省类型
逻辑类型
2.构造数据类型
结构体
共用体
枚举类型
2.基本数据类型:
C语言在不同的平台上运行结果是不一样的
Ubuntu 64位操作系统
sizeof 关键字
1.整数类型: 在内存空间所占字节数 存储方式 值域范围
unsigned short (无符号短整型) 2个字节 16位均表示数据位(数据对应的二进制形式) 0 - 65535
short ( 短整型) 2个字节 1位符号位+15位数据位(数据的补码) -32768 - 32767
unsigned int (无符号整形) 4个字节 32位均表示数据位(数据对应的二进制形式) 0 - 2^32 -1
int ( 整形 ) 4个字节 1位符号位+31位数据位(数据的补码) -2^31 - 2^31 -1
unsigned long (无符号长整型) 8个字节 64位均表示数据位(数据对应的二进制形式) 0 - 2^64 -1
long (长整型) 8个字节 1位符号位+63位数据位(数据的补码) -2^63 - 2^63 -1
整数类型默认为有符号类型
2.字符类型:
unsigned char 无符号字符型 1个字节 ( 字符 -> ASCII码表 -> 二进制数据 -> 存放内存 ) 0 - 255
char 有符号字符型 1个字节 -128 - 127
ASCII码表:
字符和二进制数据间的转换关系
'A' -> 65
'a' -> 97
3.浮点数类型:
float 单精度浮点数类型 4个字节 1位符号位 + 8位指数位 + 23位尾数位
double 双精度浮点数类型 8个字节 1位符号位 + 11位指数位 + 52位尾数位
1.浮点数类型均为有符号
2.float 6-8位有效数字、double 12-14位有效数字
3.常量和变量:
1.常量
在程序运行过程中值不会发生改变的量
1.整形常量(默认为int类型)
100
200
123
123l 长整型
123ul 无符号长整型
123u 无符号整形
123L
123U
123UL
0100 八进制常量
0x1f 十六进制常量
2.浮点型常量(默认为double类型)
3.14
3.14f
3.14F
3.14e3
3.14e-3
3.字符常量
'!'
'\''
'\\'
'\n' 换行符
'\r' 回车符
'\t' 横向制表符
'\b' 退格符
'\v' 纵向制表符
'a'
'A'
'0' 字符0
0 零
'\0' 反斜杠零
'0' 字符零
'\0' -> 0 '\0' 与 0 等价
'0' -> 48 '0' 与 48 等价
'\141' 八进制141对应的字符
'\x32' 十六进制32对应的字符
4.字符串常量
"hello world"
"a" == 'a' + '\0'
'a' == 'a'
字符串末尾有一个用来标识结尾的\0字符
5.标识常量
#define 宏名 值
#define PI 3.1415
注意:
1.标识常量宏名一般都是大写,与变量名区分
2.宏只是实现代码替换,中间不进行任何数据计算的操作(宏定义,能加括号就加括号)
3.使用宏能够提高代码的可读性
2.变量
在程序运行过程中值可以发生改变的量