c - 在宏中传递参数评估方向

标签 c macros c-preprocessor operator-precedence

据我所知,在 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

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

最佳答案

parsing of actual parameters of a function starts from rightmost and directed to left

我认为你的意思是“评估”而不是“解析”。但事实并非如此,C 标准没有指定顺序。

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

I hoped same output for macros as function

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

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

之后,您只会看到未定义的行为,如以下问题所述:Why are these constructs (using ++) undefined behavior? .

关于c - 在宏中传递参数评估方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11176778/

相关文章:

macros - 如何在 Rust 中编写宏来匹配集合中的任何元素?

c++ - 将 SVN 修订版转换为整数的 C 宏

c++ - 如何在编译时使用预处理器计算和存储哈希值?

c - 我怎样才能让 gcc 预处理器检查一个表达式的计算结果是一个值还是什么都没有?

c - 通过pthread create调用时,通过alsa输出声音的功能不起作用:无声音,CPU使用率100%

c - C 中的多重引用和取消引用

c - 小写windows.h和大写Windows.h的区别?

c - printf 和 for 函数中的后缀和前缀 (C)

C 宏 - 运算符粘贴?

从包装宏内调用 Malloc