一个C/C++中宏使用容易出现的一个问题

devtools/2024/9/24 11:26:54/

在C/C++中宏的使用只是单纯的替换,在每次替换的位置,表达式都会被计算。
而在函数中,参数传递的是表达式计算的值,而不是表达式本身。这两者的区别,就容易造成宏使用可能会出问题。下面是一个简单的例子,找出数组中最小的数。

#include <iostream>
using namespace std;#define min(a, b) ((a) < (b)? (a): (b))int main() {int a[4] = {8, 7, 6, 1000};int p = 0;int min_v = 10000;while (p < 4){min_v = min(a[p++], min_v);}cout << min_v << endl;return 0;
}

结果为1000

因为在宏min中, 其中的a, b都被计算了两次,调用方使用的p++就会被计算两次,这就不符合初衷了。


http://www.ppmy.cn/devtools/9369.html

相关文章

数据结构—单链表

1、链表的概念及结构 1.1链表的概念 链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;但在逻辑上确是连续、顺序的&#xff0c;而数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 1.2链表的结构 如下图&#xff1a; 逻辑上的链表&#xff0c;pList是指…

YOLOv9改进策略 | 损失函数篇 | EIoU、SIoU、WIoU、DIoU、FocusIoU等二十余种损失函数

一、本文介绍 这篇文章介绍了YOLOv9的重大改进&#xff0c;特别是在损失函数方面的创新。它不仅包括了多种IoU损失函数的改进和变体&#xff0c;如SIoU、WIoU、GIoU、DIoU、EIOU、CIoU&#xff0c;还融合了“Focus”思想&#xff0c;创造了一系列新的损失函数。这些组合形式的…

【若依前后端分离】仪表盘绘制

示例&#xff1a; 代码&#xff1a; InstrumentPanel.vue组件 <template><div><!-- 在这里放置你的图表组件 --><div ref"echarts" style"width: 100%; height: 400px;"></div></div> </template><script&g…

混杂设备驱动

混杂设备驱动 之前我们编写的是标准字符设备驱动程序,看起来还是有点复杂的样子。linux内核api接口提供了一种混杂设备驱动程序框架,可以大幅度降低编写字符设备驱动程序复杂性。 misc的意思是混合、杂项的,因此 misc 驱动也叫做杂项驱动,misc 驱动其实就是最简单的字符设…

.NET Core中间件管道MAP的作用和使用

在ASP.NET Core中&#xff0c;中间件是构建HTTP请求管道的基本组件。中间件组件负责在ASP.NET Core应用程序中处理请求和响应。中间件可以执行多种任务&#xff0c;例如身份验证、记录、异常处理等。你可以按顺序将多个中间件组件组合在一起&#xff0c;形成一个请求处理管道。…

vue3【实用教程】侦听器 watch,自动侦听 watchEffect(),$watch,手动停止侦听器

watch 侦听明确指定的状态变化执行回调 实战场景 侦听路由传参的变化&#xff0c;重新访问接口&#xff0c;刷新页面侦听接口返回值的变化&#xff0c;刷新页面 侦听值类型数据 // 选项式 API watch: {// 每当 question 改变时&#xff0c;这个函数就会执行question(newQue…

vue2 mixins混入

在Vue2中&#xff0c;使用mixins混入有两种方式&#xff1a; 全局混入&#xff1a;在Vue实例初始化之前&#xff0c;使用Vue.mixin()方法进行全局混入。具体步骤如下&#xff1a; 在main.js&#xff08;或其他入口文件&#xff09;中引入Vue和混入对象&#xff1a;import Vue f…

在Vue3中如何使用H.265视频流媒体播放器EasyPlayer.js?

H5无插件流媒体播放器EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;可支持H.264与H.265编码格式&#xff0c;性能稳定、播放流畅&#xff0c;能支持WebSocket-FLV、HTTP-FLV&#xff0c;HLS&#xff08;m3u8&#…