学习记录:第三周day03笔记

通讯录项目:

姓名、性别、电话,最多存储50个联系人

功能:

1、添加新联系人

2、按名字删除联系人

3、按名字修改联系人

4、查找联系人,名字或电话,支持模糊查询

5、显示所有联系人信息

6、退出系统

 

 

预处理指令:

程序员所编写的代码不能被真正的编译器所编译,需要先经过一段程序翻译一下

翻译的过程称为预处理,负责翻译的程序称为预处理器,被翻译的语句叫做预处理指令,以#号开头的都是

 

预处理指令的分类:

#include 头文件导入(拷贝)

#include<> 从系统指定路径查找头文件

#include"" 从当前工作路径路径查找,找不到再从系统指定路径查找

-I path 指定要查找的路径path

还可以通过设置环境变量来指定路径

 

#define 定义宏

宏常量:

#define MAX 50(没有;结尾,否则会把;一起当作替换内容)

优点:提高代码的可扩展性、提高可读性、提高了安全性(全局变量可以被修改)、还可以和case配合

注意:一般宏名全部大写与全局变量、局部变量区别

预定义好的宏常量:

_ _func _ _ 获取函数名

_ _FILE _ _ 获取所在文件名

_ _LINE _ _ 获取所在行号

_ _DATE _ _ 获取日期

_ _TIME _ _ 获取时间

宏函数:

是带参数的宏,不是真正意义的函数,没有发生传参,也没有返回值,也不会去检查参数的类型

#define SUM(a,b) a+b

1、先把在代码中出现宏函数的位置,替换成宏函数后面的语句

2、在把代码中使用的参数替换成调用者的参数

注意:宏的内容必须保证在同一行,如果要换行,要在每一行的末尾添加续行符\

宏函数的二义性:

由于宏函数代码位置、附近的值、参数各种原因的影响,会导致宏函数由不同的解释,这叫做宏的二义性

如何避免宏的二义性?

每个参数都加小括号,整体也加小括号,不要再宏函数的参数中使用自变运算符

 

作业:实现一个交换两个变量的值的宏函数,尽可能通用,能写几个,分析每一种的优劣

#define SWAP(a,b) {a=a+b; b=a-b; a=a-b;} 有数据溢出的风险,不适合结构体

#define SWAP(a,b) {a=a^b; b=a^b; a=a^b;} 无溢出风险,只能交换整数,不能自己交换自己

#define SWAP(a,b) {long double t=a; a=b;b=t;} 不适合结构体

#define SWAP(a,b,type) {type t=a; a=b; b=t;} 可以交换结构体,多一个参数

#define SWAP(a,b) {typeof(a) (t)=(a); (a)=(b); (b)=(t);} typeof只能在GNU编译器使用

 

预处理指令

#define

常见笔试面试题

1、简述#define与typedef的区别

首先,两种定义...

如果是普通类型,它们在功能上无任何区别,但本质不同,一个是代码替换,一个是类型重定义

对于指针类型,它们的功能由较大区别

#define INTP int*

INT p1,p2,p3 //p1是指针 p2 p3是int

typedef int* INTP;

INTP p1,p2,p3; //p1 p2 p3都是指针

 

2、宏函数与普通函数的区别

是什么?

普通函数:一段具有某项功能的代码集合,会被编译成二进制指令存储在代码段中,函数名就是它的首地址,有独立的栈内存

宏函数:带参数的宏替换,不是真正的函数,只是用起来像函数,没有独立的栈内存

区别?

是带参数的宏,不是真正意义的函数,没有发生传参,也没有返回值,也不会去检查参数的类型

函数: 返回值、类型检查、安全、入栈出栈调用、跳转、速度慢

宏函数:运行结果、通用、危险、替换、冗余、速度快

posted @ 2023-04-18 10:35  菊里菊气  阅读(12)  评论(0编辑  收藏  举报