![](/img/trans.png)
[英]How to call printf from a C function that I call in the MASM assembler?
[英]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被垃圾代替。
- 编辑
我添加了3%d但是只向printf传递了一个参数,但是第二个%d总是被函数的第一个参数替换掉?
您正在导致未定义的行为。 您指定了三个参数"\\n%d - %d - %d"
,但您只传递了一个ab(20, 13)
。
第一个输出是函数调用ab(20, 13)
返回的内容,其余的没有意义。
由于您传递了一个参数,因此您应该像这样调用它:
printf("\n%d", ab(20, 13));
printf("\n%d - %d - %d", ab(20, 13));
您拥有的是未定义的行为,因为格式说明符的数量与需要打印的值的数量不匹配。
注意:如果您对此信息有疑问,则不会定义printf()
的评估顺序。
正如其他答案已经说过的那样,这是未定义的行为,因此C标准允许符合C的实现做任何事情。
但是如果你在问这个案例中究竟发生了什么:当printf看到三个%s时,它会查找三个参数,如果它们存在的话就会出现它们的位置。 第一个是函数调用的返回值。 第二个似乎是该函数调用的参数之一,恰好留在printf查找其第二个参数的位置。 第三是一些垃圾。 您需要查看特定环境的详细信息,以及编译器如何在内存中列出变量,以了解更多信息。
你正在做的是未定义的行为。
你的printf
只得到一个参数,但你告诉它三个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.