当参数之一是函数调用时,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 查找其第二个参数的地方。第三个是一些垃圾。您将需要查看特定环境的详细信息,以及您的编译器如何在内存中布置变量,以了解更多信息。
谁能告诉我这个程序是如何在内部执行的
#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 查找其第二个参数的地方。第三个是一些垃圾。您将需要查看特定环境的详细信息,以及您的编译器如何在内存中布置变量,以了解更多信息。