首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >什么是双重评价?为什么要避免双重评价?

什么是双重评价?为什么要避免双重评价?
EN

Stack Overflow用户
提问于 2016-09-12 02:13:35
回答 2查看 8K关注 0票数 55

我在C++中使用像这样的宏读取它

代码语言:javascript
复制
#define max(a,b) (a > b ? a : b)

可能会导致“双重评估”。有没有人能给我举个例子,说明什么时候会发生双重评估,为什么会很糟糕?

附注:令人惊讶的是,当我在谷歌上搜索它的时候,我找不到任何详细的解释,除了一个用Clojure写的例子(我看不懂)。

EN

回答 2

Stack Overflow用户

发布于 2016-09-12 02:20:47

ab在宏定义中出现两次。因此,如果您将其与具有副作用的参数一起使用,则副作用将执行两次。

代码语言:javascript
复制
max(++i, 4);

如果调用前为i = 4,则返回6。由于这不是预期的行为,因此您应该更倾向于使用内联函数来替换像max这样的宏。

票数 24
EN

Stack Overflow用户

发布于 2016-09-12 02:21:16

考虑以下表达式:

代码语言:javascript
复制
 x = max(Foo(), Bar());

其中FooBar如下所示:

代码语言:javascript
复制
int Foo()
{
    // do some complicated code that takes a long time
    return result;
}

int Bar()
{
   global_var++;
   return global_var;
}

然后在原始的max表达式中展开如下:

代码语言:javascript
复制
 Foo() > Bar() ? Foo() : Bar();

在这两种情况下,Foo或Bar都将执行两次。从而花费比所需时间更长的时间或者改变程序状态的次数超过预期的次数。在我的简单Bar示例中,它不会始终返回相同的值。

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39439181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档