Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;宏(最小-最大)工作不正常_C++_Macros - Fatal编程技术网

C++ C++;宏(最小-最大)工作不正常

C++ C++;宏(最小-最大)工作不正常,c++,macros,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,

为什么下面的代码不起作用?它打印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;
}
#包括
#包括
使用名称空间std;
#定义最小(a,b)ab?a:b
int main(int argc,字符**argv)
{
int N=100;
int*drop=新的int[N+1];
下降[0]=0;下降[1]=1;下降[2]=1;

对于(int i=3;i在宏中的术语周围加上括号:

#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
正在扩展到此(无括号):

drop[i]drop[i-start]+1?开始:drop[i-start]+1?drop[i-start]:开始>drop[i-start]+1?开始:drop[i-start]+1;
可能无法按您想要的顺序计算。使用括号强制执行正确的操作顺序


如注释所述,如果宏参数被多次计算,则不应该使用宏,如果有宏代码的话,则有副作用。<>代码> STD::MIN < /C>和:STD::MAX < /C> >在代码< > /Cord>中。您可以将C++代码更改为纯C++版本

#include <iostream>
#include <algorithm>
#include <limits>
using namespace std;

int main(int argc, char ** argv) {
    int N = 100;
    int * drop = new int[N + 1];
    drop[0] = 0;
    drop[1] = drop[2] = 1;
    for (int i = 3; i <= N; ++i) {
        drop[i] = numeric_limits<int>::max();    // <limits>
        for(int start = 1; start <= i; ++start)
            drop[i] = min(drop[i], max(start, drop[i - start] + 1));    // <algorithm>
    }
    cout << drop[3] << endl;
    return 0;
}
#包括
#包括
#包括
使用名称空间std;
int main(int argc,字符**argv){
int N=100;
int*drop=新的int[N+1];
下降[0]=0;
下降[1]=下降[2]=1;

对于(iTi=3;i而不是答案,它是对所有开发人员的恳求:请不要使用宏。C++提供了这些目的的模板函数。记住宏只是替换参数而不是预先评估它们。即使您将SAMGAK解释为括号添加,这也只解决了一半问题。请考虑代码。像这样:

int x = 5;
int y = max(++x, 0);
调用者希望在这之后
x=6
y=6
;但是宏将扩展到

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

导致
x=7
y=7

仍然非常错误的表达式:如
min(x++,y)
会导致无意中双倍增加
x
。请在2分钟后查看我的答案。@Michael您不应该将宏与具有副作用的表达式一起使用。这可以说是宏的使用问题,而不是宏本身的问题。在OP的示例中,传递给宏的表达式没有副作用。@Michael:因为Acro可能是危险的,但并不意味着它们是错误的。你只需要知道你在做什么。使用库函数,这样你就不允许
min(35,“青蛙”),这是允许的,因为您使用宏和宏没有类型检查。C++语言也允许内联函数。@ ToMatasMatthW:是的,一个适当的解决方案将是类似于“代码>模板内联T max(t x,t y){返回x> y x:y;}。
更好的解决方案是使用
std::max
。除了宏以外,任何东西都可以。函数不提供延迟求值语义。宏可以,这就是为什么不能用函数替换宏。至少不是这么简单。@AnT:你是说这样的宏:
#定义日志(字符串)(日志记录和日志(字符串))
(从)速度是唯一的原因是某人想在C/C++中使用懒惰的评价而不是严格的评价吗?这很有趣。@ ArkadiuszDrabczyk,速度不是一件小事:对于生产软件来说,速度可能是成功与失败的区别。此外,懒惰的评价值不限于速度。(ptr!=NULL&&*ptr!='\n'){…}<代码> >懒惰的评估,但可能会导致一个分段错误,如果代码>& &代码>不懒。标记SAMGAK的回答作为解决我的困惑的答案,但是我想我应该使用内置的东西。但是地球上的是BITS/STDC++.H。你说它在里面,但是包含了其他的东西。我不使用C++在所有的CURA上。RLY。@ SKEST/STDC++是一个包含C++所有标题的头。但是,不用担心,我会编辑它。好的。谢谢。只是好奇BITS/STDC++H。
int x = 5;
int y = max(++x, 0);
int y = (++x > 0)? ++x : 0;