为什么当前宏会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.
为什么打印的值为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.