为什么当前宏将返回14的值?

时间:2018-06-12 15:39:14

标签: c macros c-preprocessor

为什么打印值为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 ++根本没有发生?

3 个答案:

答案 0 :(得分:4)

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

MACRO(a+b,c)

变为:

a+b*c++

因为乘法优先于加法,所以首先执行。

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

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

然后你会得到:

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

这可能是你所期望的。

对于前缀++运算符,此运算符求值为变量的当前值,然后递增变量。由于++运算符附加到c,因此会增加。结果表达式的值不会改变,但c的值现在为5。

答案 1 :(得分:2)

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

即2 + 3 * 4即14。

printf的末尾,c将增加到5(即后增量),您不会观察到。如果你写x*++y,那将是另一回事。

使用改变变量的宏是非常糟糕的想法:如果你写的话,你的代码是 undefined ,比如MACRO(a, a),即使你试图美化你的通过将参数括在括号中来实现宏。

答案 2 :(得分:0)

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