通过宏观中的参数评估方向

ami*_*n__ 0 c macros operator-precedence c-preprocessor

正如我在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;
}
Run Code Online (Sandbox Code Playgroud)

此代码输出,100 100 100 110

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

Oli*_*rth 7

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

我认为你的意思是"评估"而不是"解析".但事实并非如此,C标准没有指定订单.

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

我希望宏的相同输出作为函数

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

int i=10;
printf("%d\n", (i++) * i);
i=10;
printf("%d\n", i * (i++));
Run Code Online (Sandbox Code Playgroud)

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

  • @alaminhosain:因为对于这个特定的编译器,函数参数似乎是从右到左计算的.但是另一个编译器可以选择从左到右. (3认同)