该计划的产出?

#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应该做。 此函数比较ab ,如果它们相等则返回1,否则返回0(只是C中==的结果定义)。

 int proc(pf p, int a, int b) { return ((*p)(a, b)); } 

这里我们有proc实际做的:它需要一个函数指针(就像我们在上面看到的那样 – …) p和两个整数。 然后它调用应用于给定( ab )的两个参数的给定函数( 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 ,所以*pfun

类型pf是一种函数类型。 在main()中,函数fun被传递给函数proc,所以:

 proc(fun, 6, 6) = fun(6, 6) = 6==6 = 1 

它返回true (AKA 1)。 由于返回int,因此boolean值将从true隐式转换为1 。 程序运行正常。 6等于6,产生真或1。

 1 

函数指向“fun”的指针传递给proc,其中evalutes 6 == 6,返回true,将其转换为impliclty为“1”。

http://codepad.org/uRbOnkXb