0

正如我在C中所知道的那样,函数评估的实际参数的传递从最右边开始并指向左边。带参数的宏定义是什么情况?我编写了一个代码以使含义清晰,但输出使我感到困惑……这是代码。,

#define parsing(a,b) a*b

int parsefun(int a, int b)
{
    return a*b;    
}

int main()
{
    int i=10;
    printf("%d\n",parsing((i++),i));
    i=10;
    printf("%d\n",parsing(i,(i++)));
    i=10;

    printf("%d\n",parsefun((i++),i));
    i=10;
    printf("%d\n",parsefun(i,(i++)));
    system("PAUSE");
    return 0;
}

此代码输出,100 100 100 110

我希望宏的输出与函数相同。但这里的关键点在哪里?

4

1 回答 1

7

函数实际参数的解析从最右边开始,指向左边

我认为您的意思是“评估”而不是“解析”。但这不是真的,C 标准没有指定顺序。

因此,C 标准未指定您为函数获得的行为。

我希望宏的输出与函数相同

宏参数不被评估,它们只是被替换。所以你最终得到了这个:

int i=10;
printf("%d\n", (i++) * i);
i=10;
printf("%d\n", i * (i++));

之后,您只是看到未定义的行为,如以下问题所述:为什么这些构造(使用 ++)未定义的行为?.

于 2012-06-24T10:44:53.170 回答