使用自动递增的参数调用宏

Lok*_*wda 0 c c++

任何人都可以告诉我为什么以下代码给他以下答案

#define MAN(x,y) (x>y)?x:y
#include <stdio.h>
int main(void)
{
    int x = 10;
    int y = 5;
    int k = 0;
    k = MAN(++x, y++);
    printf("%d%d%d", x, y, k);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:12 6 12怎么样?

jua*_*nza 6

"呼叫" MAN(++x, y++)被替换为

(++x > y++) ? ++x : y++
Run Code Online (Sandbox Code Playgroud)

二者xy在对条件,之后,它们的值是评估过程中递增一次116分别.条件求值为true,因此三元表达式求值为++x.结果,x它本身再次递增,将其值增加到12.三元条件评估为12,分配给k.

因此,总体而言,x增量两次,并且y仅增加一次,并且在两个增量之后k被赋予值x.

这是预处理器宏的常见问题.