c++ - C ++宏忽略之后的内容
问题描述
我正在研究一个动态编程问题,并决定不使用 std::max 函数,因为我认为宏会更快(没有在堆栈上推送参数,而不是模板化)。
但它并没有完全按预期工作。我已经隔离了这个问题,它看起来像这样:
#include <iostream>
#define maxi(a, b) (a <= b)? b : a
using namespace std;
int main()
{
int a = 0, b = 0, c = 0;
c = maxi(a, b) + 1;
cout << c;
return 0;
}
虽然它确实返回了最大值,但它似乎忽略了之后添加的 1。在此示例中,c 的值最终为 0,而我希望它为 1。这是为什么呢?
解决方案
宏替换后的代码如下所示。你现在明白哪里错了吗?
// ...
int a = 0, b = 0, c = 0;
c = (a <= b)? b : a + 1;
要快速修复,只需将所有宏放入附加 () 作为#define maxi(a, b) ((a <= b)? b : a)
. 当您编写任何宏时,这是一个很好的做法。该更改将导致代码发生以下更改:
// ...
int a = 0, b = 0, c = 0;
c = ((a <= b)? b : a) + 1;
请记住,如果您的 a 和 b 参数更复杂,您将遇到类似的问题,因此要使宏更容易出错,您应该将所有参数也放在单独的 () 中,如#define maxi(a, b) (((a) <= (b))? (b) : (a))
推荐阅读
- python - SpeechRecognition 热词无法正常工作
- amazon-web-services - 使用 EMR 将数据从 S3 加载到 Redshift
- reactjs - 基于复选框选中/未选中将对象推送到状态变量数组
- sql-server - 在 where 语句中使用(case 和 len)时出错
- python-3.x - 如何删除第一级嵌套列表结构?
- java - 为什么我运行程序时Java中的.txt文件总是为空?
- javascript - 如何用js填充一个空的div?
- jq - JQ:无法使用字符串“结果”索引字符串
- asp.net - 如何在asp.net webforms中获取客户端登录我网站的客户端路由器的mac地址?
- twitter - Twitter api 版本 2 引发 Client Forbidden 错误