C语言诞生于1970~1973年,在肯.汤普逊和丹尼斯.里奇的编写下完成,归属于美国贝尔实验室。
C语言是专门用于编写操作系统而发明的编程语言,所以天生适合对硬件编程,也以运行速度快而著称,也非常适合实现数据结构和算法
由于出现的时间过早,有很多缺陷,也存在着很多的陷阱,但是我们的前辈给我们总结了一些避免陷阱的经验教训《C陷阱与缺陷》
C89语法标准,默认是gcc编译器的语法标准
C99语法标准,对C语言的扩展和增强
Ubuntu 16.04 默认C99 -std=gnu99 指定为C99语法标准
C11语法标准,全新的升级
一、第一个C语言程序1、vim xxx.c 创建.c源文件
2、编写代码,并保存退出
3、gcc xxx.c 编译源文件,编译成功会得到a.out可执行文件
4、./a.out 运行可执行文件
*注意:可以合并3、4
gcc xxx.c && ./a.out
#includeint main() { printf("Hello,World!n"); return 0; }
#include
程序员所编写的代码不是标准C代码,需要一段程序把它翻译成标准C代码,负责翻译的程序叫做预处理器,
翻译的过程叫做预处理,需要被翻译的代码叫做预处理指令,以#开头的代码叫做预处理指令
#include 功能是导入头文件
#include
<>从系统指定路径查找头文件并导入
#incldue"xxx.h"
""先从当前工作路径查找头文件,如果找不到再从系统指定路径查找并导入
stdio.h
头文件:以.h结尾,里面存放的是辅助性代码,绝大多数都是函数的说明
mian()函数:
C语言以函数为单位管理代码,一个函数就是一段具有某一项功能的代码段
main函数是程序的执行入口,必须有且只能有一个
int 是一种数据类型,它表示main函数的执行结果是一个整数
return 功能有两个:
1、结束函数的执行
2、返回一个结果给函数的调用者
mian函数的调用者是操作系统,它的返回值是给了操作系统的,它的值能反应出程序是如何结束
的,一般有三类:
-
正数 出现异常 (别人的错误)
-
0 一切正常
-
负数 出现错误 (自己的错误)
printf/scanf 是标准库中的函数,负责输出数据、输入数据
printf(“想要输出的内容”);
转义字符:
键盘上一些无法直接打印显示的符号,用一些特殊的字符组合来表示,这种特殊的字
符组合称为转义字符,n就是其中之一
n 换行
r 回到行首
t 制表符,相当于Tab,用于输出格式对齐
b 退格键
a 铃响
表示一个
%% 表示一个%
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 头文件的编译结果文件,它会被优先使用
.i 预处理文件
.s 汇编文件
.o 目标文件
.a 静态库文件
.so 共享库文件
五、存储空间的单位:Bit 比特 一个二进制,只能存储0或者1,计算机中存储数据的最小单位
Byte 字节 八个二进制位,计算机存储器的存储容量的基本单位
KB 1024字节
MB 1024KB
GB 1024MB
TB 1024GB
PB 1024TB
六、数据类型为什么要对数据进行分类?
1、现实生活中的数据本身就自带类别属性
2、对数据进行分类可以节约存储空间、提高运行速度
C语言中数据分类为两大类:自建(程序员自己设计的类型:结构、联合、类)和内建(C语言自带的类型)
注意:运算符 sizeof 可以计算类型、变量的字节数
整型:
signed 有符号 signed char 1字节 -128~127 signed short 2字节 -32768~32767 signed int 4字节 正负20亿 signed long 4/8字节 正负20亿 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字节 0~正负40亿 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字节 double //双精度 8字节 long double //12/16字节
注意:小数点后六位有效
注意:采用一定的算法对真实的浮点型数据到二进制数据进行转换,这个过
程比存储、读取整型要慢得多,编程时尽量使用整型数据
double num
if(num<0.000001&&num>-0.000001)
模拟型:
字符型:char
字符就是符号或者图案,在内存中存储的依然是整数,需要显示出字符时,
会根据ASCII表中对应的关系显示出对应的字符或者图案
‘ ’ 0
‘0’ 48
‘A’ 65
‘a’ 97
布尔型:bool
先有C语言后有的bool类型,所以C语言中没不可能有真正的布尔类型,在
头文件stdbool.h中对布尔类型进行了模拟
bool true false
七、变量与常量什么是变量:程序运行期间数值可以发生变化的叫做变量,相当于一个存储数据的盒子
定义: 类型名 变量名;
int num;
取名规则:
1、由字符、数字、下划线组成
2、不能以数字开头
3、不能与C语言32个关键字重名,能默
4、见名知意 (功能、类型、作用范围)
使用:
赋值: 变量名 = 10;
参与运算: 2+(变量名*10);
注意:C语言中变量的初始值是随机的,为了安全起见,一般在定义时初始化为0
变量的输出与输入:
int printf(const char *format, ...);
功能:输出数据
format:“双引号包含的提示信息+占位符”
…:变量名列表
返回值:输出字符个数
类型占位符:C语言中通过类型占位符传递变量的类型
float %f
double %lf
long double %LF
字符型 char %c
signed char short int long long long %hhd %hd %d %ld %lld unsigned char short int long long long %hhu %hu %u %lu %llu
int scanf(const char *format, ...);
功能:输入数据
format:“双引号包含的占位符”
…: 变量地址列表
返回值:成功输入的变量的个数
注意:scanf需要提供变量的地址
&变量名 == 变量地址
什么是常量:程序运行期间数值不能改变叫做常量
100 默认int类型
100l long
100ll long long
100u unsigned int
100lu unsigned long
100llu unsigned long long
3.14 默认double
3.14f float
3.14l long double
八、格式化输入输出%nd 显示n个字符宽度,不够则补充空格,右对齐
%-nd 显示n个字符宽度,不够则补充空格,左对齐
%0nd 显示n个字符宽度,不够则补充0,左对齐
%n.md 显示n个字符宽度(小数点也算一位),不够则补充空格,m表示小数点后几位(四舍五入,不够补0),右对齐
%g 不显示小数点后多余的0
九、运算符 自变运算符:++/--
-
前自变:
++num/–num 立即生效
-
后自变:
num++/num-- 下一行语句才有效
注意:不要再一行代码中多次使用自变运算符
+ - * / %
整数/整数 结果还是整数,没有小数点,只保留整数部分
10/3 ->3
10%3 ->1
/ % 除数不能为0,否则就会浮点数例外,(核心已转储),这是个运行报错,一旦产生程序立即停止,后面不在执行
关系运算符:> < >= <= == !=
比较结果0(不成立)或1(成立),比较结果可以继续参与后续的运算
int n=-100;
if(10 结果永远为真,与数学运算规则不同 注意:== 建议常量放左边 && || ! 先把运算对象转换成逻辑值,0转换为假,非0转换为真 A && B 一假即假 A || B 一真即真 !A 求反 && || 短路特性 当左边部分的值可以确定整个表达式的结果时,右边部分就不执行计算 三目运算符:运算对象有三个部分 A?B:C 判断A的值如果为真则执行B,否则执行C a = 10; a=a+10; a+=10; a-=10; a*=10; a/=10; a%=10; & | ~ ^ << >> 00110010 0x32 11001010 0xCA 00000010 0x02 A | B 按位相或 00110010 0x32 11001010 0xCA 11111010 0xFA ~A 按位求反 00110010 0x32 11001101 0xCD A ^ B 按位异或 相同为0,相异为1 00110010 0x32 11001010 0xCA 11111000 0xf8 A << n 把A的补码左移n位,左边丢弃,右边补0 0x32 << 3 左移*2 00110010 0x32 10010000 0x90 A >> n 把A的补码右移n位,右边丢弃,左边补符号位 0x32 >> 3 右移/2 10110010 0x32 11110110 0xf6 只有相同类型的数据才能运算,如果类型不相同的类型需要先转换 相同类型后再进行计算。 自动转类型转换: 转换规则: 以不丢失数据为基础,可以适当地牺牲一些空间 1、字节少的向字节多的转 2、有符号的向无符号的转 3、整型向浮点型转 注意:char short 如果与不同类型的数据运算时,会先提升为int类型后参与运算 强制类型转换: (新类型名)数据; 这种方式有可能会丢失数据,慎重使用
A & B 按位相与



