有人可以告诉我这个程序如何在内部执行
#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总是被函数的第一个参数替换?
答案 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
只有一个参数,但你告诉它三个。