C ++宏(最小最大值)无法正常工作

时间:2015-07-06 05:05:39

标签: c++ macros

为什么下面的代码不起作用?它打印INT_MAX。但是如果我取消注释内部for循环中的两行,那么它工作正常(打印2)。我不能像这样组合两个宏?不确定是否需要进一步的细节...非常自我解释。

感谢。

#include <iostream>
#include <limits.h>

using namespace std;

#define min(a,b) a<b?a:b
#define max(a,b) a>b?a:b

int main(int argc, char **argv)
{
    int N = 100;
    int *drop = new int[N+1];
    drop[0] = 0; drop[1] = 1; drop[2] = 1;
    for(int i=3; i<=N; i++)
    {
        drop[i] = INT_MAX;
        for(int start=1; start<=i; start++)
        {
            drop[i] = min(drop[i], max(start, drop[i-start]+1));
            //int x = max(start, drop[i-start]+1);
            //drop[i] = min(drop[i], x);
        }
    }
    cout<<drop[3]<<endl;
    return 0;
}

3 个答案:

答案 0 :(得分:7)

在宏中的术语周围加上括号:

#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))

实际上,这是:

drop[i] = min(drop[i], max(start, drop[i-start]+1));

正在扩展到此(没有括号):

drop[i] < start > drop[i-start]+1 ? start: drop[i-start]+1 ? drop[i] : start > drop[i-start]+1 ? start: drop[i-start]+1;

可能无法按您打算的顺序进行评估。使用括号强制执行正确的操作顺序。

如评论中所述,如果对宏参数进行多次评估,则不应对具有副作用的表达式使用宏。

答案 1 :(得分:7)

C ++已在var cmp1; var cmp2; var bg = $("#mq3").css('background-image'); var bg1 = $("#mq6").css('background-image'); var bg2 = $("#mq9").css('background-image'); $(document).ready(function() { $("#mq9").click(function() { //alert("Hello Welcome"); if ($("#mq9").css("background-image") === bg2) { $("#mq9").css("background-image", "url('images/bkv.png')"); cmp1 = $("#mq9").css('background-image'); cmp2 = $("#mq3").css('background-image'); cmp3 = $("#mq6").css('background-image'); if (cmp1 === cmp3) { alert("welcome mohit"); //setTimeout("window.open('Qtwo.html')",3000); } } else { $("#mq9").css("background-image", "url('images/cmst.png')"); bg2 = $("#mq9").css('background-image'); } }); }); 中定义了std::minstd::max。您可以将代码更改为纯C ++版本

<algorithm>

答案 2 :(得分:6)

而不是答案,这是对所有开发人员的恳求:请不要使用这样的宏。 C ++为这些目的提供了模板功能。请记住,宏只是替换参数而不是预先评估它们。即使您在samgak解释时添加括号,这只能解决问题的一半。考虑这样的代码:

int x = 5;
int y = max(++x, 0);

之后调用者会期望x=6y=6;然而宏将被用于

int y = (++x > 0)? ++x : 0;

导致x=7y=7