我写的程序如下:
#include<cstdio>
#define max(a,b) a>b?a:b
using namespace std;
int main()
{
int sum=0,i,k;
for(i=0;i<5;i++)
{
sum=sum+max(i,3);
}
printf("%d\n",sum);
return 0;
}
I got the output : 4
但是当我将 max(i,3
) 存储在变量 k
中然后添加到 sum
时,我得到了正确的输出:
#include<cstdio>
#define max(a,b) a>b?a:b
using namespace std;
int main()
{
int sum=0,i,k;
for(i=0;i<5;i++)
{
k=max(i,3);
sum=sum+k;
}
printf("%d\n",sum);
return 0;
}
Output : 16
有人能解释一下为什么会这样吗?
最佳答案
hash-define 宏是字符串扩展,不是“语言”的东西。
sum=sum+max(i,3);
扩展为:
sum=sum+i>3?i:3;
如果你写的没有 () 圆,你应该得到错误的答案。试试这个:
#define max(a,b) (a>b?a:b)
但是还是有很多的情况会失败。正如其他人指出的,一个更好的宏是:
#define max(a,b) ((a)>(b)?(a):(b))
但它在太多情况下仍然会失败,例如带有副作用的参数被计算两次。尽可能避免使用宏并执行以下操作会好得多:
template <typename T> T max(T a, T b) { return a>b?a:b; }
或者,事实上,使用已经为您编写的 std::max 和 std::min!
关于c++ - #define 中定义的最大值无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28457086/