IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【无标题】c语言--#define替换规则 -> 正文阅读

[C++知识库]【无标题】c语言--#define替换规则

本文对#define 定义的有宏参数替换进行描述,望觉得对你们有帮助的程序猿们小小点赞一下。

一.#define定义宏

#define 机制允许把参数替换到文本中,这种实现通常称为宏(marco)或定义宏(define marco)

下面是宏的声明方式:

#define name(parament-list)stuff

注意:参数列表左括号必需与name相连

#define SQUARE(x) x*x

这个宏接收一个参数

SQUARE(5)

运行程序时,预处理器就会用下面这个表达式替换上面的

#define SQUARE(5) 5*5

结果为25。

但这个宏还存在问题
观察下面的代码

int a=5;
printf("%d", SQUARE(a+1))

答案并不是我们认为的36
事实上,它输出的结果是11
为什么?

替换文本时,x被替换为 a+1
然后 语句实际为:
printf(“%d”, a+1*a+1)

结果自然为11

改进方法也很简单,在宏定义是加上两个括号

#define SQUARE(x) (x)*(x)

再次运行

printf(“%d”, (a+1)*(a+1))

结果为36

你以为代码就完善了吗
还有一个宏定义

#define ADD(x) (x)+(x)

int a=5;
printf("%d",10* ADD(a))

你认为结果是多少
100 or 其它
太年轻了
请看代码
运行替换完后:

int a=5;
printf("%d",10*5+5 ))

结果为 55
怎么改进呢,
也是加上一个括号

#define ADD(x) ((x)+(x))

再次运行变为

printf(“%d”,10*((5)+(5) ))

结果自然为100。

二.宏参数的副作用

这里的副作用指的是改变了其它的值

int a=1int b;
b=a+1

上述代码在给吧b赋值的时没有改变a的值
无副作用

int a=1int b;
b=a++

给b赋值的同时改变了a的值
就产生了副作用

当宏参数在宏的定义中出现超过一此的时候,如果参数带有副作用,那么你在使用宏时会带来不可预测的效果。

代码如下

#define MAX(a,b)(a)>(b)?(a):(b)
...
x=3;
y=4;
z=MAX(x++,y++)
printf("%d %d %d",x,y,z);

根据上述内容可以尝试算一算
解析如下:

z=(x++>(y++?(x++):(y++)
//明显x++<y++,所以结果再进行一次y++
//x=4,y=6,z=5
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-10-17 12:13:43  更:2022-10-17 12:17:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 3:16:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码