类似函数的宏和奇怪的行为

2023-12-03

我已经开始阅读《Effective C++》,在第 2 项中的某个时刻,提到了以下内容:

// call f with the maximum of a and b
#define CALL_WITH_MAX(a, b) f((a) > (b) ? (a) : (b))

...

int a = 5, b = 0;
CALL_WITH_MAX(++a, b); // a is incremented twice
CALL_WITH_MAX(++a, b+10); // a is incremented once

这里,a 在调用 f 之前递增的次数 取决于它与什么进行比较!

事实上,如果我在中使用一个简单的打印语句f, 7 在第一次调用中被打印出来,但我一生都无法弄清楚为什么。我错过了一些明显的东西吗?


编译器会用您传入的内容逐字替换宏。所以你最终会得到

int a = 5, b = 0;
f((++a) > (b) ? (++a) : (b));
f((++a) > (b+10) ? (++a) : (b+10));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

类似函数的宏和奇怪的行为 的相关文章

  • C++ std::accumulate 没有给出预期的总和

    double numbers 1 0 5 0 333333 0 25 0 2 0 166667 0 142857 0 125 0 111111 0 1 std vector
  • 错误:表达式不可赋值三元运算符

    我有以下代码 MPLABX XC8 编译器给出此错误 错误 表达式不可分配 U1ERRIRbits RXFOIF uart1 oerr 1 uart1 oerr 0 这是相关代码部分 typedef union struct bool fe
  • 带有 ASP.NET 按钮回发的 jQuery UI 对话框

    我的 ASP NET 页面上有一个运行良好的 jQuery UI 对话框 jQuery function jQuery dialog dialog draggable true resizable true show Transfer hi
  • copy_from_user() 错误:目标大小太小

    我正在为内核模块编写 ioctl 处理程序 我想从用户空间复制数据 当我编译禁用优化的代码时 O0 gflags 编译器返回以下错误 include linux thread info h 136 17 error call to bad
  • 非模板函数中的尾随返回类型[重复]

    这个问题在这里已经有答案了 我见过有人使用以下语法来实现函数 auto get next gt int 代替 int get next 我理解两者 并且我知道尾随返回类型语法对于使用 decltype 的模板代码很有用 就我个人而言 我会避
  • 如何以编程方式删除受信任的根证书颁发机构中的证书?

    我需要能够从组织中的每台电脑中删除特定的证书 是的 我可以逐个座位 但我要到周四才能完成 而且我没有人力逐个座位 是否有使用 C 的编程方式来执行此操作 我认为你不需要编写任何 C 看看certmgr exe del http msdn m
  • 如何在 C# 中以编程方式将行添加到 DataGrid?

    正如标题所述 我正在尝试使用 C 以编程方式将行添加到 DataGrid 但我似乎无法使其工作 这是我到目前为止所拥有的 I have a DataGrid declared as dg in the XAML foreach string
  • C# 结构默认值

    我有一个方法 它接受一个包含许多具有基本数据类型的字段的结构 我想传递大部分默认值 但需要进行一些调整 但我了解结构声明中的基本字段不能包含默认值声明 例如struct S int a 42 现在是这样的 OptionsStruct opt
  • 重载算术运算符

    赋值运算符可以声明为 T 运算符 const t 在类中 但不能以这种方式定义算术运算符 它必须是友元函数 我不明白为什么 你能解释一下吗 算术运算符不必须是友元 那么你可以这样定义 MyClass MyClass operator con
  • 注入包含接口的所有已注册实现的 Enumerable

    给出以下接口 public interface IMyProcessor void Process 我希望能够注册多个实现 并让我的 DI 容器将它们的可枚举注入到这样的类中 public class MyProcessorLibrary
  • 如何在 C 中链接目标文件?失败并显示“架构 x86_64 的未定义符号”

    因此 我尝试在我的文件 file2 c 中使用另一个 C file1 c 文件中定义的函数 为了做到这一点 我包含了 file1 file1 h 的标头 但是 每当我尝试使用 gcc 编译文件时 我都会收到以下错误 Undefined sy
  • 更改私有模块片段是否会导致模块重新编译?

    On 此页面有关 C 20 模块功能 https www modernescpp com index php c 20 modules private module fragment and header units 我发现了这样的说法 借
  • 如何从 Powerpoint 2010 导出电影?

    如何使用 MS Office PIA 主互操作程序集 或其他方式以编程方式将嵌入视频从 powerpoint 2010 导出到外部文件 在演示文稿中嵌入视频是 Powerpoint 2010 中的一项新功能 我找不到解决方案 PPTX 文件
  • C# 可以为控制台应用程序部分类“程序”类吗?

    我想知道是否可以将为任何控制台应用程序创建的默认 程序 类更改为部分类 我想这样做是因为我想要更好的组织 而不是将所有方法都放在按区域分类的 1 个文件中 对我来说 将某些方法类别放在单独的文件中会更有意义 我对分部类的理解是 它是多个文件
  • 将 AutomationID 与 ListView 结合使用

    我正在尝试将 AutomationId 附加到列表视图中的项目 理想情况下 将项目名称绑定到显示的项目
  • MPI - 发送和接收列

    我需要从一个进程发送矩阵列并从另一个进程接收它 我尝试运行以下程序 但得到了一个奇怪的结果 至少我这么认为 仅复制矩阵的第一个元素 某些矩阵元素会发生意外变化 include
  • Clang 5.0 上的 vsprintf 和 vsnprintf [-Wformat-nonliteral] 警告

    我有这段代码 static void err doit int errnoflag int level const char fmt va list ap int errno save unsigned long n char buf MA
  • 在多线程环境中捕获信号

    我有一个大型程序 需要尽可能具有弹性 并且有大量线程 我需要捕获所有信号SIGBUS SIGSEGV 并在必要时重新初始化有问题的线程 或者禁用该线程以继续减少功能 我的第一个想法是做一个setjump 然后设置信号处理程序 可以记录问题
  • 尝试后终于没有被调用

    由于某种原因 在我的控制台应用程序中 我无法运行我的finally 块 我编写这段代码是为了测试finally块是如何工作的 所以它非常简单 static void Main int i 0 try int j 1 i Generate a
  • 如何将模型绑定到动态创建的类 nancyfx

    首先感谢任何愿意查看我的问题的人 我对 Nancyfx 还很陌生 在尝试将 JSON 有效负载绑定到动态创建的类时遇到问题 我按照这篇文章中的代码动态创建了该类 在C 中动态创建一个类 https stackoverflow com que

随机推荐

  • 在 Spring 5 中与子级共享父级 Spring 上下文

    如何在 Spring 5 中与孩子共享父上下文 使用 spring 4 我们可以通过locatorFactorySelector as context param
  • 使用 jQuery 调用远程 ASMX 的问题

    我一直在尽力正确理解这一点 XML SOAP 和 JSON 响应之间有什么区别 人们如何知道如何调用其响应为上述之一的 Web 服务 如果我偏离了轨道 请纠正我 我问这个问题的原因是因为我试图在我的 NET3 5 web应用程序中从jQue
  • Codeigniter - Active Records 是否容易受到 SQL 注入攻击?

    刚刚读过this堆栈溢出 因此让我想知道是否可以通过 CI 中的活动记录进行 SQL 注入 在我的项目中的大多数地方 对于用户注册和用户配置文件更新 我都完成了如下 SQL 插入 控制器 name this gt input gt post
  • Katalon 和 Chrome 无头模式的屏幕截图

    我使用以下代码来截取 Katalon Studio 脚本中警告和错误消息的屏幕截图 import ru yandex qatools ashot AShot import ru yandex qatools ashot Screenshot
  • 如何将 React 开发工具与 React Native 结合使用?

    我目前正在使用 React Native 来开发 Android 应用程序 并在 genymotion 中进行模拟 我尝试使用反应开发人员工具调试我的应用程序 如下所述here JS 错误在控制台中抛出 但我无法在 chrome 开发工具中
  • Outlook .items.restrict 使用两个过滤器

    我正在使用一个打开电子邮件并下载其附件的脚本 现在我可以选择下载最新电子邮件中的最新附件 Sub CTEmailAttDownload Const olFolderInbox As Integer 6 gt Path for the att
  • C# 中暂停/恢复线程

    当达到某个值时 我尝试暂停所有线程 但我做不到 我希望当我达到这个值时 所有线程都暂停 10 秒 并在这 10 秒后所有线程再次启动 我尝试过 Threads Sleep Threads Interrupt and Threads Abor
  • rmarkdown 在 kable 中转义 html

    我正在尝试为我的 kable 表的单元格提供一些自定义 HTML 类 但问题是 div 的编码就像单元格的内容一样 我记得闪亮的桌子有一种方法可以让 celle 的内容逃逸并按原样解释 rmarkdown knitr 有这样的东西吗 例如
  • 图像顶部的光滑滑块文本

    我正在尝试制作一个非常正常的轮播 在垂直中间的两侧有两个箭头 在图像顶部的中间有一个按钮的文本 尽管箭头和文本都是绝对的并且具有更高的 z index 但我无法让任何内容出现在图像顶部 这是带有我的代码的代码笔 http codepen i
  • javascript event.target 在 mozilla 中不起作用

  • .stop() 和 .animate() jQuery 函数转换为 javascript

    我也想学习 JavaScript 并查看各种 jQuery 函数及其等效的 JavaScript 我想将此 jQuery 函数转换为其等效的 JavaScript 函数 我怎样才能做到这一点 sample stop animate left
  • 在 Firebase 模型中保存推送的 ID

    我这里有 2 个 firebase 问题 A 以编程方式是一个好的做法吗将ID复制到本地模型 从数据库中排除 解析值时 来自 Firebase 的 Frank 建议该解决方案 在模型 Firebase 上保存 userId B 另一种解决方
  • ASP.Net ScriptMethod 生成空 JSON

    我正在使用 JavaScript 访问名为 GetPerson 的 ScriptService 方法 问题是它返回一个相当空的 JSON 字符串而不是实际的对象字符串 当我返回一个新的 DateTime 对象时也会发生同样的情况 因此我希望
  • LeanModal 不是一个函数

    希望你能帮我解决这个问题 我在我的网站上使用了一些 jQuery 脚本 其中一个是leanModal 我过去已经使用过几次 没有任何问题 我正在开发的网站 使用 WP 工作正常 直到几个小时前该模式停止工作 查看错误控制台 它指出 is n
  • 使用 WebJarAssets & Play 2.5 时如何防止循环依赖?

    在我实施了建议后answer我最后的question 在浏览器中访问该应用程序时收到以下错误 ProvisionException Unable to provision see the following errors 1 Tried p
  • 无法在下一个js上读取firebase中未定义的属性“长度”

    我在下一个 js 中使用 firebase 但它给出了一条错误消息 类型错误 无法读取未定义的属性 长度 无论如何我可以修复这个错误 这是我的 firebase 配置文件 import as firebase from firebase a
  • 同一任务上的多次等待可能会导致阻塞

    在同一个任务上使用多个等待应该小心 我在尝试使用时遇到过这种情况BlockingCollection GetConsumingEnumerable 方法 最终得到这个简化的测试 class TestTwoAwaiters public vo
  • 如何自动启动Solr?

    此刻我必须去 usr java apache solr 1 4 0 example然后执行以下操作 java jar start jar 如何让它在启动时自动启动 我在共享 Linux 服务器上 当您使用共享 Linux 机器时 您可能必须
  • 如何在C#中分割多个字符串

    我的问题包括如何分割这样的字符串 List of devices attached r n9887bc314 tdevice r n12n1n2nj1jn2 tdevice r n r n Into n9887bc314 n12n1n2nj
  • 类似函数的宏和奇怪的行为

    我已经开始阅读 Effective C 在第 2 项中的某个时刻 提到了以下内容 call f with the maximum of a and b define CALL WITH MAX a b f a gt b a b int a