一、第一个C语言程序
1、vim xxx.c 创建.c源文件
2、编写代码,并保存退出
3、gcc xxx.c 编译.c源文件,成功会得到a.out可执行文件
4、./a.out 运行可执行文件
注意:可以合并3、4
gcc xxx.c && ./a.out
#include
程序员所编写的代码不是标准C代码,需要一段程序把它翻译成标准C代码,负责翻译的程序叫做预处理器,
翻译的过程叫做预处理,需要被翻译的代码叫做预处理指令,以#开头的代码叫做预处理指令
#include 功能是导入头文件
#include
从系统指定路径(/usr/include/)查找头文件并导入
#include “xxx.h”
“” 先从当前的工作路径查找头文件,如果找不到再从系统指定路径查找并导入
stdio.h
头文件:以.h结尾,里面存放的是辅助性代码,绝大多数都是函数的说明
int main()
{
printf(“Hello World!n”);
return 0;
}
main函数:
C语言以函数为单位管理代码,一个函数就是一段具有某一项功能的代码段
main函数是程序的执行入口,必须有且只能有一个
int 是一种数据类型,它表示main函数的执行结果是一个整数
return 功能有两个:
1、结束函数的执行
2、返回一个结果给函数的调用者(return返回值的取值范围是0~255)
main函数的调用者是操作系统,它的返回值是给了操作系统的,它的值能反应出程序是如何结束的,一般有三类:
正数 出现异常 (别人的错误)
0 一切正常
负数 出现错误 (自己的错误)
可以输入 echo $? 来查看mian返回的值
printf/scanf 是标准库中的函数,负责输出数据、输入数据
printf(“想要输出的内容”);
转义字符:
键盘上一些无法直接打印显示的符号,用一些特殊的字符组合来表示,这种特殊的字符组合称为转义字符,n 就是其中之一
r 回到行首
t 制表符(一个制表区占8列),相当于Tab,用于输出格式对齐
b 退格键
a 铃响
\ 表示一个
%% 表示一个%
*可以用12 来表示此时为8进制需转换成十进制再通过ascII码来找到对应n,r,t,回车之类的
x12 此时是16进制
C语言中以分号作为一行代码的结束,使用大括号划分区域
二、编译器
负责把人能看得懂的记录着代码的文件,翻译成计算机能看得懂的二进制文件,由预处理器、编译器、链接器组成
gcc是由GNU社区为了编译Linux内核代码而开发的一款免费的编译器
gcc常用的编译参数:
-E 只显示预处理的结果到终端
-std=gnu99 设置C99语法标准
-c 只编译不链接
-o 指定编译结果的名字 -oname或-o name
-S 生成汇编代码
-I 指定头文件的加载路径 -I 加载路径
-Wall 尽可能多地产生警告
-Werror 把警告当错误处理
-l 指定要加载的代码库 -lm 使用数学库
警告可以生成可执行文件,错误不行
三、C代码变成可执行文件的详细过程:
1、预处理 把源文件翻译成预处理文件
gcc -E code.c 显示预处理结果到终端
gcc -E code.c -o code.i 生成以.i结尾的预处理文件
2、编译 把预处理文件翻译成汇编文件
gcc -S code.i 生成以.s结尾的汇编文件
3、汇编 把汇编文件翻译成二进制的目标文件
gcc -c code.s 生成以.o结尾的目标文件
4、链接 把若干个目标文件合并成一个可执行文件
gcc a.o b.o c.o … 默认生成a.out可执行文件
每个步骤不是必须要经过可以直接步骤三再步骤四
四、C语言的文件类型:
.c 源文件
.h 头文件
.h.gch 头文件的编译结果文件(gcc xxx.h),它会被优先使用—>如果后面更改了.h文件内的内容仍然会优先执行.h.gch文件
.i 预处理文件
.s 汇编文件
.o 目标文件
.a 静态库文件
.so 共享库文件
五、存储空间的单位:
Bit 比特 一个二进制位,只能存储0或者1,计算机中存储数据的最小单位
Byte 字节 八个二进制位,计算机存储器描述存储容量的基本单位
KB 1024字节
MB 1024KB
GB 1024MB
TB 1024GB
PB 1024TB
六、数据类型
为什么要对数据进行分类?
1、现实生活中的数据本身就自带类别属性
2、对数据进行分类可以节约存储空间、提高运行速度
C语言中数据分类为两大类:自建(程序员自己设计的类型:结构、联合、类)和内建(C语言自带的类型)
注意:运算符 sizeof 可以计算类型、变量的字节数 —> sizeof((int)a+1.0)—->8 但是只计算结果的sizeof并不参与运算结果中
整型:
signed 有符号
signed char 1 -128~127
signed short 2 -32768~32767
signed int 4 正负20亿
signed long 4/8
signed long long 8 正负9开头19位整数
unsigned 无符号
unsigned char 1 0~255
unsigned short 2 0~65535
unsigned int 4 0~40亿
unsigned long 4/8
unsigned long long 8 0~1开头20位整数
注意:signed不加就代表了加
由于定义无符号整型时比较麻烦,C标准库把这些类型重定义成一些新的简单的类型名:
需要导入头文件
uint8_t uint16_t uint32_t uint64_t
int8_t int16_t int32_t int64_t
浮点型: 有小数部分的类型
float 单精度 4 有效数字7
double 双精度 8 有效数字15
long double 12/16
注意:小数点后默认输出六位,但不一定有效
注意:采用一定的算法对真实的浮点型数据到二进制数据进行转换,这个过程比存储、读取整型要慢得多,编程时尽量使用整型数据
double num(如何判断一个double类型变量的值是否等于0?)
因为浮点型数据存储是不精确(十进制小数如何转化为二进制?)的,所以不能直接判断: num == 0
if(num -0.000001)
if(abs(num)
模拟型:
字符型:char 单引号括起来的单个字符(注意转移字符的含义)
字符就是符号或图案,在内存中存储的依然是整数,需要显示出字符时,会根据ASCII表中对应的关系显示出对应的字符或图案
‘