#define中定义的最大值无法正常工作

Ric*_*wal 2 c c++

我写的程序如下:

#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

有人可以解释为什么会这样吗?

And*_*man 5

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!