2

Summary

1)C语言中,实参和函数的形参之间仅仅是值传递,因此在函数内部无法改变实参的值。

2)函数是一种代码复用的手段

3)宏是C语言中代码复用补充方式,是对函数的一种补充;函数和宏的关系,类似于生活中演员和替身的关系,只是用于某些特殊场景。在大部分情况仍然优先考虑函数。

4)宏没有函数调用的开销,函数调用需要在栈上维护活动记录;宏只是简单的文本替换,因此代码块会膨胀,函数只会使用同一段函数体;宏替换不会对类型进行检查,当宏和运算符结合在一起时,会出现意想不到的错误,函数会进行类型检查,也不会出现二义性;

5)编译器组成简介:

  1. 预处理模块:处理所有#开头的语句(复制粘贴替换 --> 中间文件.i)
  2. 编译模块:将C程序翻译成二进制程序(中间文件.i --> 汇编文件.s --> 二进制文件.o)
  3. 链接模块:将二进制程序组合成可执行程序(.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);

宏与函数的不同:

  • 宏不是函数,没有函数调用的过程(不需要在栈上维护函数调用的记录);函数调用会先传递参数值,然后跳转执行函数体,然后返回
  • 使用宏只是单纯“代码复制粘贴”,然后替换参数
  • 同一个函数,无论调用多少次,都只有一份函数体代码;同一个宏,每次都会“复制粘贴”相同代码

编译器组成简介:

  1. 预处理模块:处理所有#开头的语句(复制粘贴替换 --> 中间文件.i)
  2. 编译模块:将C程序翻译成二进制程序(中间文件.i --> 汇编文件.s --> 二进制文件.o)
  3. 链接模块:将二进制程序组合成可执行程序(.o --> .out)

再论宏常量:#define NAME value

  • 预处理模块将代码中出现的NAME标识符全部文本替换为value
  • 因此,宏常量在本质上与字面量相同(真正意义上的常量)

本文总结自“狄泰软件学院”唐佐林老师《C语言入门课程》。
如有错漏之处,恳请指正。


bryson
169 声望12 粉丝