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

时间:2015-02-26 06:33:42

标签: c printf

有人可以告诉我这个程序如何在内部执行

#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被垃圾代替..

- 编辑

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

4 个答案:

答案 0 :(得分:4)

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

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

由于你传递了一个参数,你应该这样称呼它:

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

答案 1 :(得分:2)

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

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

注意:如果您对此信息有疑问,则未定义printf()内的评估顺序。

答案 2 :(得分:2)

正如其他答案已经说过的那样,这是未定义的行为,因此C标准允许符合C的实现做任何事情。

但是,如果你在问这个案例中究竟发生了什么:当printf看到三个%s时,它会查找三个参数,如果它们存在的话,它们将会存在。第一个是函数调用的返回值。第二个似乎是该函数调用的参数之一,恰好留在printf查找其第二个参数的位置。第三是一些垃圾。您需要查看特定环境的详细信息,以及编译器如何在内存中列出变量,以了解更多信息。

答案 3 :(得分:1)

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

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