该计划的产出?

时间:2010-08-29 13:43:40

标签: c++ objective-c c

#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

5 个答案:

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

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

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

答案 3 :(得分:0)

1

函数指向“fun”的指针传递给proc,它计算6 == 6,返回true,隐式转换为“1”。

http://codepad.org/uRbOnkXb

答案 4 :(得分:0)

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