增量(++)宏中的解引用指针 - >结果是+2而不是+1

时间:2015-09-17 17:36:58

标签: pointers macros increment

我有以下代码:

#include <stdio.h>

#define MIN(x, y) ((x) <= (y) ? (x) : (y))

int main ()
{
int x=5, y=0, least;
int *p;
p = &y;
least = MIN((*p)++, x);
printf("y=%d", y);
printf("\nleast=%d", least);
return 0;
}

我希望得到以下结果:     y=1     least=1 而是y=2。 有人可以解释为什么y现在是2而不是1。我想这是因为一些双增量,但我不明白它背后的机制。 感谢。

2 个答案:

答案 0 :(得分:1)

预处理器宏通过文本替换工作。所以你的行:

least = MIN((*p)++, x);

扩展到

least = (((*p)++) <= (x) ? ((*p)++) : (x));

双增量很明显。

答案 1 :(得分:0)

这是因为你使用的是宏。由于您正在通过宏传递解除引用的指针加上增量,因此宏将取消引用的指针和增量操作放在宏中显示的每个位置。由于y在宏中显示两次,因此增量运算符会发生两次。

如果在调用宏之前进行增量,则y应该只为1。