#include<stdio.h>
int fun(int, int);
typedef int (*pf) (int, int);
int proc(pf, int, int);
int main()
{
printf("%d\n", proc(fun, 6, 6));
return 0;
}
int fun(int a, int b)
{
return (a==b);
}
int proc(pf p, int a, int b)
{
return ((*p)(a, b));
}
//程序的直接链接:http://codepad.org/fBIPiHGT
答案 0 :(得分:4)
该程序的输出是:
1
好的,让我们看看那里发生了什么。
#include<stdio.h>
此行仅包含标准输入/输出功能。
int fun(int, int);
这告诉编译器:好的,我们有一个名为fun
的函数,它接受两个int
变量,返回int
。
typedef int (*pf) (int, int);
这为指向函数的指针安装了一个快捷方式,该函数使两个int
变量返回int
,因此这种函数指针可以使用pf
缩写。
int proc(pf, int, int);
告诉编译器:好的,我们有一个名为proc
的函数接受pf
变量(就像我们在上面看到的那样 - 一个函数指针,它指向一个带有两个int
个变量的函数返回int
)个,两个int
个变量,返回int
。
int main()
{
printf("%d\n", proc(fun, 6, 6));
return 0;
}
执行程序时运行的中央过程。它告诉程序打印一个数字(%d
)和一个换行符(\n
)。该数字的值应为proc(fun,6,6)
。
int fun(int a, int b)
{
return (a==b);
}
这里我们有fun
函数应该做的事情。此函数比较a
和b
,如果它们相等则返回1,否则返回0(只是C中==
结果的定义)。
int proc(pf p, int a, int b)
{
return ((*p)(a, b));
}
这里我们有proc
实际做的:它需要一个函数指针(正如我们在上面看到的那样 - ......)p
和两个整数。然后它调用应用于给定(p
和a
)的两个参数的给定函数(b
)并返回p
的结果。
因此,如果我们致电proc(fun, 6, 6)
,proc
将调用fun(6,6)
,其评估为1(自6==6
起)并返回此结果(1
)
所以,输出只是
1
但老实说:请看一些事情,并在询问之前尝试自己弄清楚事情(为什么输出这个和那个):
答案 1 :(得分:2)
类型pf是一种函数类型。在main()中,函数fun被传递给函数proc,所以:
proc(fun, 6, 6) = fun(6, 6) = 6==6 = 1
答案 2 :(得分:2)
printf("%d\n", proc(fun, 6, 6));
将proc的结果输出为 int 。
return ((*p)(a, b));
返回运行p(a,b)
,ergo fun(6,6)
return (a==b);
6 == 6
返回true
,投放到 int 等于 1 。
全部因为:
int(true) == 1
关于这一行:
return ((*p)(a, b));
...与:
相同return (*p)(a, b);
我们在这里做的是取消引用函数指针p
,以便可以使用传递的参数进行调用。 (*p)
是解除引用的指针,(a, b)
是参数。 p
指向fun
,因此*p
为fun
。
答案 3 :(得分:0)
答案 4 :(得分:0)
它正在返回true
(AKA 1)。由于您返回的是int,因此boolean
值会从true
隐式转换为1
。程序运行正常。 6等于6,产生真或1。