学习记录:第三周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、宏函数与普通函数的区别
是什么?
普通函数:一段具有某项功能的代码集合,会被编译成二进制指令存储在代码段中,函数名就是它的首地址,有独立的栈内存
宏函数:带参数的宏替换,不是真正的函数,只是用起来像函数,没有独立的栈内存
区别?
是带参数的宏,不是真正意义的函数,没有发生传参,也没有返回值,也不会去检查参数的类型
函数: 返回值、类型检查、安全、入栈出栈调用、跳转、速度慢
宏函数:运行结果、通用、危险、替换、冗余、速度快
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」