你这段代码能编译通过?最少有三个地方需要修改:
1,funa函数没有返回值,按题目意思它应该返回int型
2,funb函数同1
3,sub函数,第一个参数是个函数指针,这个函数指针的定义如下:
int(*t)()
说明它返回int型,并且没有参数,但是在sub里调用的时候又是这样的:
return(*t)(x,y);
这里在编译的时候肯定会报错,因为函数的参数个数都不对,按题目意思,sub函数应该是这样:
sub(int(*t)(int ,int),int x,int y) {return(*t)(x,y);}//函数指针t指针的函数应该有两个int型的参数
而且,在main函数里调用的时候,p这个函数指针也是有两个int型参数的:
int x,(*p)(int,int);
所以,代码应该修改成这样才能编译通过:
#include
int funa(int a,int b) {return a+b;}
int funb(int a,int b) {return a-b;}
int sub(int(*t)(int , int),int x,int y) {return(*t)(x,y);}
int main()
{
int x,(*p)(int,int);
p=funa;
x=sub(p,9,3);
x+=sub(funb,8,3);
printf("%d\n",x);
}
它的计算过程是通过函数指针来调用funa和funb两个函数,并且把这两个函数的计算的结果相加,而这两个函数,funa用来计算两个数的和,funb用来计算两个数的差。
所以:
x=sub(p,9,3);//计算9和3的和,结果是12
x+=sub(funb,8,3);//计算8和3的差,并和12相加,所以,最终x为17
测试截图如下:
前两个问题,有的编译器能通过隐式转换处理掉,也许不会报错,但第三个问题是明显的错误,编译会有问题。
再补充一下,我刚才找了几种编译器试了一下,C语言支持这种写法,编译正常,但用C++编译器编译的时候报错。楼主说明这是个C程序,那应该没问题,不过这种代码看上去会让人很迷惑,建议还是把函数指针的参数列表写全。个人意见,仅供参考。
sub(int(*t)(),int x,int y) 是一个自定义的函数,函数体为return(*t)(x,y);意思是返回t指针指向的函数的返回值。比如后面x=sub(p,9,3)返回的就是以p代表的函数funa(),并且以9,3为实参的值,相当于求funa(9,3)
sub(int(*t)(),int x,int y) {return(*t)(x,y);}
是一个函数的实现
函数名sub
参数
int(*t)()是函数指针
{return(*t)(x,y);}
(*t)(x,y);
调用指针指向的函数。
一开始
p=funa
x=funa(9,3) = 12
然后 x+=funb(8,3)
x = 12+(8-3) =17