当参数之一是函数调用时,printf 如何在 c 中工作

How printf work in c when one of the argument is a function call

谁能告诉我这个程序是如何在内部执行的

#include<stdio.h>

typedef int (* afp)(int a, int b);

int abc(int x, int y)
{       
    return x+y;
}       

int main()
{       
    afp ab;
    ab = &abc;
    printf("\n%d - %d - %d", ab(20, 13));
    return 0;
} 

得到的输出是

33 - 20 - 4195712

如您所见,第一个 %d 被替换为预期结果 20+13,但下一个 %d 总是被函数的第一个参数替换,最后一个 %d 被一个垃圾替换..

--编辑

我添加了三个 %d 但只向 printf 传递了一个参数,但是第二个 %d 如何总是被函数的第一个参数替换??

printf("\n%d - %d - %d", ab(20, 13));

您遇到的是未定义的行为,因为格式说明符的数量与需要打印的值的数量不匹配。

注意:如果您想了解此信息,printf() 中的评估顺序未定义。

你正在做的是未定义的行为。

你的 printf 只得到一个参数,但你告诉它三个。

您正在导致未定义的行为。您指定了三个参数 "\n%d - %d - %d",但您只传递了一个 ab(20, 13).

第一个输出是那个函数调用的ab(20, 13)returns,其余的没有意义。

既然你传递了一个参数,你应该这样调用它:

printf("\n%d", ab(20, 13));

正如其他答案所说,这是未定义的行为,因此 C 标准允许符合标准的 C 实现执行任何操作。

但是如果您要问在这种情况下到底发生了什么:当 printf 看到三个 %d 时,它会在它们本来存在的地方寻找三个参数,如果它们存在的话。第一个是函数调用的 return 值。第二个似乎是该函数调用的参数之一,恰好留在 printf 查找其第二个参数的地方。第三个是一些垃圾。您将需要查看特定环境的详细信息,以及您的编译器如何在内存中布置变量,以了解更多信息。