程序的编译需要经过以下四个过程:
预处理:
gcc -E xxxx.c -o xxxx.i
(1).宏替换:将定义的宏直接用值替换掉;
(2).去除注释:把文件中所写的注释去除掉;
(3).引入头文件:将头文件中函数的声明等内容复制一份到程序中;
编译:
gcc -S xxxx.i -o xxxx.s
(1).语法语义纠错;
(2).将main.i文件转换成汇编代码文件;
汇编:
gcc -C xxxx.s -o xxxx.o
(1):将汇编指令解释为二进制指令文件main.o文件
注意:内联函数就是在此阶段展开的
链接:
gcc xxxx.o -o app
(1):链接库文件或相关文件,生成可执行文件
语句与表达式
语句:以 ;结尾的代码
表达式:以一个或多个运算符连接的 常量 ,变量 , 其它表达式 所形成的子式称为表达式
其中:
变量: 有空间 有值 有类型
常量: 有空间(不能访问) 有值 有类型
表达式:有空间(临时空间) 有值 有类型
显示转换
(数据类型) 变量 / 常量 / 表达式 :将原有数据类型转换成数据类型
隐式转换
(1) 混合运算过程中的数据类型转换
原则:低精度精度类型向高精度数据类型转换;
1.浮点型 > 整形以及整形兼容型数据类型
2.大空间数据类型 > 小空间数据类型的精度
3.无符号数据类型 > 有符号数据类型的精度
(2)赋值运算过程中数据类型转换
原则:由右值的数据类型向左值的数据类型转换
数据类型隐式转换的方式
(1).整形及整形兼容型数据
(1:等空间 => 等空间 :数据的原样拷贝
(2:小空间 => 大空间 :有符号型数据(符号位扩展) 无符号型数据(高位补零)
(3:大空间 => 小空间 :截取数据低位
(2).浮点型数据 => 整形及整形兼容型数据 :小数部分丢失
(3).整形以及整形兼容型数据类型 => 浮点型 :小数部分扩展
(4).单精度 => 双精度 :精度扩展
(5).双精度 => 单精度 :精度损失
运算符
(1).sizeof运算符(单目)
注意:sizeof是一个在编译阶段就起效果的运算符,在其内的任何运算都是没有意义的。
比如:int i = 0;sizeof(i++)在编译阶段就会被替换成sizeof(int) 来计算,并不会改变i的值。
(2).算数运算符
++:自增运算符
--:自减运算符
注意:
自增,自减运算符均为单目运算符
自增,自减运算符操作数只能是变量,不能是常量或者表达式
(3).强制类型转换符
(类型名) a
注意:
强制类型转换符只在使用档次有效,不根本改变操作数的类型
(4).赋值运算符
赋值运算符将右值复制到左值的空间;
赋值表达式的值取最左侧操作数的左值;
注意:
初始化不等于赋值。初始化是在创建变量的时候赋予其一个初始值,而赋值是把对象的当前值用一个新值来替代。(在变量的声明周期中,初始化只会发生一次,而赋值可以发生多次)