一.编译过程
1.预编译阶段 选项:gcc -E test.c -o test.i
主要处理文件中宏定义,注释,以及将头文件插入到主代码中,生成扩展名为“.i”的文件,替换原来的.c文件(原文件保留)。
2.编译阶段 选项:gcc -S test.c -o test.s
将代码转化成汇编语言或某种中间代码。编译器首先会检查代码的规范性,是否有语法错误等,以确定代码实际要做的工作;检查完毕后转换为底层机器可处理的汇编语言,即生成.s文件替换.i文件。
3.汇编阶段 选项:gcc -C test.c -o test.o
将汇编语言直接映射为二进制码,以二进制码格式的指令将会打包封存成可重新定位的目标程序的格式,生成.o文件替换原来的.s文件。.o文件由段组成,且至少有两个段:代码段和数据段。代码段主要包含程序的指令,数据段主要是各种全局变量或静态数据。
4.链接阶段 gcc test.o -o xxx
将多个.o文件整合成一个可执行文件。
该阶段的三个步骤:
1)将代码和数据模块象征性地放入内存
2)决定数据和指令标签的地址
3)修补内部和外部引用
GCC选项描述:
-E 预处理指定的源文件,不进行编译。
-S 编译指定的源文件,但不进行汇编。
-c 编译、汇编指定的源文件,但不进行链接。
-o 指定生成文件的文件名。
二.三目运算符(又称条件运算符)
书写:<表达式1> ? <表达式2> : <表示式3>;
返回值:先求表达式1,如果为真,则执行表达式2,并返回表达式2的结果;如果表达式1的值为假,则执行表达式3,并返回表达式3的结果。
三.隐形转换(算术运算)
原则:
1.低精度数据类型向高精度数据类型转换
2.赋值运算过程中右值的数据类型向左值的数据类型转换
方式:
1.等空间到等空间:数据的原样拷贝
2.小空间到大空间:
有符号数据类型:符号位扩展
无符号数据类型:高位补零
3.大空间到小空间:截取数据低位