目录
gcc编译器编译过程
(1)预处理阶段 处理与#相关的预处理指令
gcc-E XXX.c -o xxx.i
//预处理#include #define
(2)编译阶段 预处理产生的C语言程序编译为 汇编语言
gcc -S XXX.c -o xxx.s
(3)汇编阶段 将编译阶段产生的汇编语言翻译为二进制机器语言
gcc -C XXX.c -o xxx.o
(4)链接阶段 将汇编阶段 产生的二进制机器语言翻译链接成可执行程序
//ESC ISO//
语句与表达式
语句:以;结尾的代码
表达式占据空间为临时空间
显示转换
(数据类型)变量 常量 表达式
int a=100,b=200;
printf("a/b=%f\n",(float)a/b);
只在当次转化时有效,不根本改变操作数类型数在内存中的存储形式
将原有的数据类型转换为指定类型
int a;
(long)a;d
隐式转换
混合运算过程中数据类型转换
原则 1. 浮点型 >整型 以及整型兼容性数据类
2.大空间的数据类型高于小空间数据类型精度
3.无符号数据 精度高于 有符号 数据类型的精度
4.所在位置越高,权重越高。
赋值运算过程中的数据类型转换
由右值的数据类型向左值的数据类型转换
数据类型隐式转换的方式
1.整型及整型兼容性数据转换
(1)等空间向等空间
数据原样拷贝
(2)小空间向大空间
被转换类型原先有符号 符号位扩展
无符号数 高位补0
(3)大空间向小空间转换
赋值 截取数据低位
2.浮点型数据 》 整型及整型兼容型//取整
3.整型及整型兼容性数据 》浮点型
小数部分拓展
4.单精度向》精度转换
精度扩展
5.双精度向单精度
精度损失
运算符
(1)sizeof运算符(单目) 在编译过程中计算sizeof
sizeof(变量名, 数据类型名, 常量,表达式);
(2)% 取余运算符//浮点数不支持取余运算
num =模*模数+余数
(3)++自增--自减运算符 //单目运算符
自增 自减 操作数只能是变量
a++//先用后加(加之前的值作为a++ 表达式所使用)
++a//先加后用(加之后的值作为++a表达式所使用)
(4)赋值运算 将右边的复制到左边
赋值表达式的值取最左边操作数的值
赋值不等于初始化
逻辑运算符
1 非零值真 0 假
&& 既要... 又要... // 一假全假
|| // 是...或者...
!逻辑非 真变假 假变真
注意
(1).短路法则 :左操作数已确定执行完毕 已确定表达式整体的结果,则短路右操作数的执行
(2).浮点型数据的关系判断:在有限的精度范围内判断。
逗号运算符
(多目运算符 )//目数取决于有多上个逗号
表达式的值取最后一个子表达式的值作为逗号表达式的值
运算符优先级结合性
优先级 :单目 高于 双目 高于 三目 高于 多目
双目 算数运算符 高于 关系运算符 高于 逻辑运算符
注意 赋值运算符 双目 小于三目
结合方向 自左至右
从右至左特殊情况
自由致左 ;1.单目运算符2. 特殊运算符3.赋值运算符
思考 两个浮点数比较大小
要想比较两个浮点数的大小 首先确认一个精度,用两个浮点数相减之后的值与精度比较。
#include <stdio.h>
#include<math.h>
#include<float.h>
#define EPSILON 0.0000001//宏定义一个精度
int main()
{
double a = 1.0;
double b = 0.1;
//使用自定义精度计算
if((a-b) < EPSILON || (a-b)>EPSILON)
{
printf("a");
}
else
printf("b");
/*
使用库中精度和绝对值函数
if (fabs(a) - b < DBL_EPSILON)
printf("a");
else
printf("b");*/
return 0;
}