C语言笔记(三)

第十三节 三目运算符和逗号表达式
1、三目运算符计算后得到的是一个具体的值而不是变量本身;
2、三目运算符的返回类型:sizeof(a>b?a:b)
i. 通过隐式类型转换规则返回a和b中较高的类型;
ii.当a和b不能进行隐式类型转换到同一类型时编译出错;
3、逗号表达式的值为最后一个子表达式的值;

第十四节 编译过程简介
1、编译过程分为预处理、编译、汇编、链接;
2、预处理指令:gcc -E file.c -o file.i
① 处理所有的注释,以空格代替
② 将所有的#define删除,并且展开所有的宏定义
③ 处理条件编译指令#if #ifdef #elif #else #endif
④ 处理#include,展开被包含的头文件
⑤ 保留编译器需要使用的#pragma指令
3、编译指令:gcc -S file.c -o file.s
① 对预处理文件进行词法分析、语法分析、语义分析;
注:
词法分析:分析关键字、标识符、立即数是否合法;
语法分析:分析表达式是否遵循语法规则;
语义分析:在上一步的基础上继续分析表达式是否合法;
② 分析结束后进行代码优化生成相应的汇编代码文件;
4、汇编指令 : gcc -c file.c -o file.o
① 汇编器将汇编代码转变为可以执行的机器指令;
② 每条汇编语句几乎都对应一条机器指令;

第十五节 链接器
1、链接器的主要作用是把各个模块(目标文件)之间的相互引用的部分处理好,是的各个模块之间能够正确的衔接;
2、模块链接的方式有两种:静态链接和动态链接
① 静态链接就是在链接时将库的内容直接加入到可执行程序中,以下是编译静态库的步骤:
gcc -c lib.c -o lib.o;ar -q lib.a lib.o;gcc file.c lib.a -o a.out;
② 动态链接是可执行程序在运行时才会动态加载库,库的内容不会进入可执行程序中,以下是编译动态库的步骤:
gcc -shared dlib.c -o dlib.so; gcc main.c -ld -o a.out;
③ 关键系统调用:
dlopen:打开动态库文件
dlsystem:查找动态库中的函数并返回调用地址
dlclose:关闭动态库

第十六节 位运算符分析
1、左移和右移注意点:
① 左操作数必须是整数型类,char和short被隐式转换为int后做移位;
② 右操作数的范围[0, 31],否则结果未知;
③ 左移规则:高位丢弃,低位补0;
④ 右移规则:低位舍弃,高位补符号位;

第十七节 类型转换
1、隐式类型转换的发生:
① 算数运算中,低类型转换为高类型;
② 赋值表达式中,表达式中的值转化为左边的变量的类型;
③ 函数调用时,实参转换为形参的类型;
④ 函数返回值,return表达式转换为返回值类型;
2、安全的隐式转换:
char->int->unsigned int->long->unsigned long->float->double;
char->short->int->unsigned int->long->unsigned long->float->double;

第十八节 宏定义与使用分析
1、宏表达式被预处理器处理,编译器并不知道宏表达式的存在;
2、宏表达式用“实参”完全代替形参,不进行任何运算;
3、宏表达式没有任何的“调用”开销;
4、宏表达式中不能出现递归定义;
5、预处理器不会对宏定义进行语法检查;
6、宏定义的效率高于函数调用,宏的使用会带来一定的副作用;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值