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

标签 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;
}

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/

相关文章:

c - 解密不知道原始扩展名的文件时如何知道扩展名

c++ - 为什么指向整数的指针递增 4 个字节?

c++ - 统一初始化语法区别

c++ - 使用 placement new 来更改 reference_wrapper 持有的变量类型是否定义了行为?

c++ - GtkSpinButton 是否能够设置时间间隔?

c++ - 为什么 "long *"和 "int *"在 32 位代码中不兼容?

c - 程序过早离开循环

c++ - 通过引用传递的智能指针可以是 nullptr 吗?

c++ - 你如何通过传递 "this"关键字来分配 weak_ptr?

c - 使用指针时的意外行为和编译器错误