为什么打印值为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 ++根本没有发生?
答案 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.(注意运算符适用于变量,而不是计算结果)。