以下C语言程序,输出为什么是17?

2025-03-10 04:53:54
推荐回答(3个)
回答1:

你这段代码能编译通过?最少有三个地方需要修改:

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程序,那应该没问题,不过这种代码看上去会让人很迷惑,建议还是把函数指针的参数列表写全。个人意见,仅供参考。

回答2:

sub(int(*t)(),int x,int y) 是一个自定义的函数,函数体为return(*t)(x,y);意思是返回t指针指向的函数的返回值。比如后面x=sub(p,9,3)返回的就是以p代表的函数funa(),并且以9,3为实参的值,相当于求funa(9,3)

回答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