为什么当前宏会return的值为14?

Why the current macro will return the value of 14?

为什么打印的值为14? 当我尝试计算当前宏时,我得到了这个。

注意**此问题是在测试中提出的。

选项 1: 2+3*4++ 然后 2+12++ 然后 2+13 = 15
选项 2: 2+3*4++ 然后 2+12++ 然后 2+12++ = 14(打印后值会增加到 15?)

代码:

#include <stdio.h>  
#define MACRO(x,y) x*y++   
void main()
{  
  int a=2,b=3,c=4;
  printf("%d\n",MACRO(a+b,c));
}

此外,我尝试将结果放入 var 中,得到了相同的结果 14,这意味着打印后该值保持为 14。有人可以向我解释为什么 op ++ 根本没有发生吗?

MACRO(a+b,c) 扩展为 a+b*c++

即 2 + 3 * 4 即 14。

printf的末尾,c会增加到5(即post-increment),你不要观察。如果你写 x*++y.

就不一样了

使用改变变量的宏是一个非常糟糕的想法:你的代码是未定义如果你写,说MACRO(a, a) ,即使您试图通过将参数括在括号中来美化您的宏。

它是一个 post 增量运算符。这意味着当前值被检索并用于计算,然后变量的值递增。如果您在该语句之后查看 c 的值,它将是 5。(注意运算符适用于变量,而不是计算结果)。

宏执行给定标记的直接替换。所以这个:

MACRO(a+b,c)

变成:

a+b*c++

因为乘法比加法有更高的优先级,所以先执行。

使用宏时的最佳做法是将所有参数括起来:

#define MACRO(x,y) ((x)*(y)++)

那么你会得到:

((a+b)*(c)++)

这可能是您所期望的。

至于前缀 ++ 运算符,此运算符计算变量的当前值,然后 递增变量。由于 ++ 运算符附加到 c,这就是递增的内容。结果表达式的值没有改变,但是 c 的值现在是 5.