我写的程序如下:
#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;
}
Run Code Online (Sandbox Code Playgroud)
我得到了输出: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;
}
Run Code Online (Sandbox Code Playgroud)
产量:16
有人可以解释为什么会这样吗?
hash-define宏是字符串扩展,而不是"语言"的东西.
sum=sum+max(i,3);
Run Code Online (Sandbox Code Playgroud)
扩展为:
sum=sum+i>3?i:3;
Run Code Online (Sandbox Code Playgroud)
如果你用no()编写它,你应该得到错误的答案.试试这个:
#define max(a,b) (a>b?a:b)
Run Code Online (Sandbox Code Playgroud)
但仍有许多情况会失败.正如其他人指出一个更好的宏是:
#define max(a,b) ((a)>(b)?(a):(b))
Run Code Online (Sandbox Code Playgroud)
但是在很多情况下它仍然会失败,例如副作用的参数被评估两次.在可能的情况下避免使用宏并做类似的事情要好得多:
template <typename T> T max(T a, T b) { return a>b?a:b; }
Run Code Online (Sandbox Code Playgroud)
或者,事实上,使用已经为你编写的std :: max和std :: min!