共计 1115 个字符,预计需要花费 3 分钟才能阅读完成。
Summary
1) C 语言
中,实参和函数的形参之间仅仅是值传递
,因而在函数外部无奈扭转实参的值。
2)函数是一种 代码复用
的伎俩
3)宏是 C 语言中 代码复用
的补充
形式,是对函数的一种补充;函数和宏的关系,相似于生存中 演员和替身
的关系,只是用于某些非凡场景。在大部分状况依然优先思考函数。
4)宏没有函数 调用的开销
,函数调用须要在栈上保护流动记录;宏只是简略的文本替换,因而 代码块
会收缩,函数只会应用同一段函数体;宏替换不会对类型进行查看,当宏和运算符联合在一起时,会呈现意想不到的谬误,函数会进行 类型查看
,也不会呈现二义性;
5)编译器组成简介:
预处理模块
:解决所有 #结尾的语句(复制粘贴替换 –> 两头文件.i)编译模块
:将 C 程序翻译成二进制程序(两头文件.i –> 汇编文件.s –> 二进制文件.o)链接模块
:将二进制程序组合成可执行程序(.o –> .out)
宏定义
问题:以下代码输入什么?为什么?
void swap(int a, int b) | |
{ | |
int t = a; | |
a = b; | |
b = t; | |
} | |
int main() | |
{ | |
int x = 1; | |
int y = 2; | |
swap(x, y); | |
x = ? | |
y = ? | |
} |
以上代码输入为 x = 1, y = 2;尽管咱们进行了替换,然而 x 和 y 的值依然没变,起因在于:实参和形参之间仅仅是值传递
,所有函数中无奈间接扭转实参的值。
再次了解函数:函数是一种 代码复用
的伎俩
- 把实现某个性能的代码片进行封装(当做一个整体)
- 给这个代码片段一个适合的名字(通过名字来应用代码)
- 定义参数(定义代码片段须要解决的问题)
C 语言中的的宏,是对函数“缺点”的 补充
- 宏是 C 语言中代码复用的补充形式
- 宏定义的语法:
#define MACRO(param) code_segment
-
宏应用语法:
MACRO(num);
#define ADD(a, b) a + b int z = ADD(1, 2);
宏与函数的不同:
- 宏不是函数,没有函数调用的过程(不须要在栈上保护函数调用的记录);函数调用会先传递参数值,而后跳转执行函数体,而后返回
应用宏只是单纯“代码复制粘贴”
,而后替换参数- 同一个函数,无论调用多少次,都只有一份函数体代码;同一个宏,
每次都会“复制粘贴”雷同代码
编译器组成简介:
预处理模块
:解决所有 #结尾的语句(复制粘贴替换 –> 两头文件.i)编译模块
:将 C 程序翻译成二进制程序(两头文件.i –> 汇编文件.s –> 二进制文件.o)链接模块
:将二进制程序组合成可执行程序(.o –> .out)
再论宏常量:#define NAME value
- 预处理模块将代码中呈现的 NAME 标识符全副文本替换为 value
- 因而,宏常量在实质上与字面量雷同(真正意义上的常量)
本文总结自“狄泰软件学院”唐佐林老师《C 语言入门课程》。
如有错漏之处,恳请斧正。
正文完