该计划的产出?
#include 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
该程序的输出是:
1
好的,让我们看看那里发生了什么。
#include
该行仅包括标准输入/输出function。
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); }
在这里,我们有什么functionfun
应该做。 此函数比较a
和b
,如果它们相等则返回1,否则返回0(只是C中==
的结果定义)。
int proc(pf p, int a, int b) { return ((*p)(a, b)); }
这里我们有proc
实际做的:它需要一个函数指针(就像我们在上面看到的那样 – …) p
和两个整数。 然后它调用应用于给定( a
和b
)的两个参数的给定函数( p
)并返回p
的结果。
因此,如果我们调用proc(fun, 6, 6)
fun(6,6)
proc(fun, 6, 6)
, proc
将调用fun(6,6)
,其计算结果为1(自6==6
)并返回此结果( 1
)。
所以,输出将是公正的
1
但老实说:请看一些事情,并在询问之前尝试自己弄清楚事情(为什么输出这个和那个):
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
。
类型pf是一种函数类型。 在main()中,函数fun被传递给函数proc,所以:
proc(fun, 6, 6) = fun(6, 6) = 6==6 = 1
它返回true
(AKA 1)。 由于返回int,因此boolean
值将从true
隐式转换为1
。 程序运行正常。 6等于6,产生真或1。