C语言 ——— #define 定义宏

目录

何为宏

宏的声明及其使用方式

宏中的括号是否多余


何为宏

#define 机制包括了一个规定,允许把参数替换到文本中,这种实现通常称宏


宏的声明及其使用方式

声明代码演示:

#define  MAX(x,y)  ((x)>(y)?(x):(y))

使用代码演示:

int a = 3;
int b = 5;int max = MAX(a, b);

代码解析:

MAX(a, b) 在程序预处理阶段会被替换成:

int max = ((a)>(b)?(a):(b));

代码验证:


宏中的括号是否多余

提问:

在宏中的每个变量都加上了括号,加上括号的意义在哪,是否能去掉括号呢?

代码演示:

// 不加括号
#define  MUL(x,y)  x * y // 加上括号
#define  MUL(x,y)  ((x) * (y))

使用代码演示:

int a = 3;
int b = 5;int sum = MUL(a + b, b - a);

代码解析:

a + b 的和 于 b - a 的差 做乘法,a + b = 8 ,b - a = 2

预期结果:8 * 2 = 16

不加括号代码验证:

加上括号代码验证:

结论:

可以从代码验证中看出,不加括号的结果和预期的结果大相径庭

出现这一问题的原因在于两点:

  1. 宏是完完全全的替换,替换前并不会进行计算,所以是直接将 a + b 和 b - a 替换到宏中,这样就会出现优先级的先后问题
  2. 宏中的变量不一定是变量,有可能是表达式,有可能是函数等等

所以在声明宏的时候,最好加上必要的括号,以免出现优先级问题 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1523428.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

第66期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大语言模型(LLM)等安全领域应用的知识。在这里,您可以找…

xxe漏洞靶场实战通过

1、用nmap扫描C段,找到靶场 2、打开网址,查看robots.txt文件 3、发现有两个目录,分别查看发现一个登录页面 4、使用BP抓包,发现是xml类型 5、尝试查看/etc/passwd 文件,在尝试查看xxe.php文件,发现是编码后…

VXLAN 为何采用UDP

VXLAN 简介 VXLAN是一种网络虚拟化技术,它通过在UDP数据包中封装MAC地址和IP信息,使得二层网络(如以太网)能够跨越三层网络(如IP网络)进行扩展。这种封装方式不仅支持TCP流量的传输,还能有效处…

合宙LuatOS开发板Core_Air780EP使用说明

Core-Air780EP 开发板是合宙通信推出的基于 Air780EP 模组所开发的, 包含电源,SIM卡,USB,天线,音频等必要功能的最小硬件系统。 以方便用户在设计前期对 Air780EP模块进行性能评估,功能调试,软…

辞职一年赚了50w才知道:上班真的不赚钱。

不知不觉就进入九月了,一年一度的苹果秋季发布会又准备开始了。 听说今年iPhone系列有重磅升级,会搭载苹果智能 「Apple Intelligence」,搓搓手等着以旧换新了! 此前iPhone15 pro max系列用户已经可以享受部分AI功能,…

【C++模板初阶】

文章目录 一、泛型编程二、函数模板1.函数模板概念2.函数模板格式3.函数模板的原理4 函数模板的实例化1. 隐式实例化2. 显式实例化不同类型形参传参时的处理 5.模板参数的匹配原则 三、类模板1 类模板的定义格式2 类模板的实例化 一、泛型编程 首先大家先思考一个问题&#xff…

文字转视频软件哪个好用?揭秘创意新工具

最近,我在筹备一个小型的个人项目,需要制作一系列的教学视频,但我对视频编辑一窍不通。就在我快要放弃的时候,我发现了一些神奇的工具,它们能自动把文字变成视频! 想知道自动生成视频的软件有哪些吗&#…

nginx配置白名单服务

http { # 其他配置… # 定义一个名为 whitelist 的共享内存区域 limit_zone whitelist $binary_remote_addr 10m;server {listen 80;server_name example.com;# 白名单配置location / {# 设置只允许特定 IP 访问allow 192.168.1.100; # 允许的 IPallow 192.168.1.10…

【嵌入式学习笔记】---- OLED屏幕工作原理

1 驱动芯片SSD1603简介 1.1 SSD1603芯片图 SSD1603是一款点阵显示屏控制器,可嵌入在屏幕中,用于执行接收数据、显示存储、扫描刷新等任务驱动接口:128个SEG引脚和64个COM引脚,对应 128 64 128\times 64 12864像素点阵显示屏内置…

Gartner发布安全威胁情报产品和服务市场指南:威胁情报产品和服务需具备的8项核心能力和21项可选能力

安全和风险管理领导者很难知道哪些威胁会真正影响到他们的组织。他们应该利用这项研究来选择正确的安全威胁情报产品和服务,并更有效地了解和应对威胁形势。 主要发现 各种规模和垂直行业的企业对威胁情报 (TI) 产品和服务的需求持续增加,但许多组织仍然…

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界!

随着编程语言的不断演进,Python已经成为开发者们心目中的“瑞士军刀”。它的简洁易用、强大的库支持、广泛的应用领域,让它在人工智能、数据分析、网络爬虫、自动化办公等领域展现了无与伦比的优势。那么,如何深入掌握Python这门语言并用它解…

电脑技巧:如何在Win11电脑上调整设置,让屏幕更加护眼?

目录 一、调整屏幕亮度 二、启用夜间模式 三、调整色彩设置 四、使用第三方护眼软件 五、保持良好的用眼习惯 总结 随着长时间使用电脑的人越来越多,护眼问题也变得越来越重要。Win11作为更新的操作系统,提供了更多的设置选项来帮助我们保护眼睛。本文将详细介绍如何在…

宝贝甜梦秘籍!康姿百德柔压磁性枕豪华款守护成长每一夜

科学护航童年梦!康姿百德豪华柔压磁性枕,给孩子五星级的睡眠享受 孩子的成长过程中,良好的睡眠环境至关重要。而康姿百德柔压磁性枕(豪华款),凭借其独特的设计和材料,成为了孩子成长过程中不可…

RISC-V (八)定时器中断

​​​​​​​riscv中断的分类 Core local INTerrupt: CLINT CLINT编程接口-寄存器 mtime寄存器,由中断触发的时钟,按照固定频率计数。

24最新『ComfyUI』入门到入坟全套教程!!看到就是赚到!赶紧收藏!

前言 本文简介 Stable Diffusion WebUI 应该是大多数人第一次接触 SD 绘画的工具,这款工具简单易上手,但操作流程相对固定。如果你想拥有更自由的工作流,可以试试 ComfyUI。而且很多新的模型和功能在刚出现时 ComfyUI 的支持度都比较高&…

Flutter之Linux命令行搭建Android 环境

一、简介 在Linux系统下使用命令行安装Android Studio可以提供更灵活的安装方式,适用于那些熟悉命令行操作的开发者。 二、操作流程 2.1 下载安装包 参考链接 历史版本下载:https://developer.android.com/studio/archive?hlzh-cn 最新版本下载&am…

实习项目|苍穹外卖|day5

复习Redis 原来也是跟着黑马学的redis,教程里的项目是点评网站。(也忘记的差不多了) 这里先自己复习一下如何安装和使用。 1.环境 (也有windows版本) 目前来说肯定是在linux(这里使用虚拟机的方式&…

redis之地理空间geo实战以及选项详解

redis之地理空间geo实战以及选项详解 Redis GEO Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 版本新增。 Redis GEO 操作方法有: geoadd:添加地理位置的坐标。 geopos:获取地理…

MongoDB之MongoDB Compass工具

MongoDB Compass 是 MongoDB 官方提供的一款图形化用户界面 (GUI) 工具,用于与 MongoDB 数据库进行交互和管理。Compass 提供了丰富的功能,能够帮助开发者、数据库管理员以及数据分析师轻松管理和分析 MongoDB 数据。以下是对 MongoDB Compass 的详细介绍…

Elasticsearch之储存原理和优化

存储原理 上篇介绍了在 ES 内部索引的写处理流程,这个流程是在 ES 的内存中执行的,数据被分配到特定的分片和副本上之后,最终是存储到磁盘上的,这样在断电的时候就不会丢失数据。 具体的存储路径可在配置文件 ../config/elastics…