我用C语言编写教程。
我需要解密的代码很少。
代码如下:
int f(){return 1;}
int g(){return 2;}
int (*h(int (*pf1)(), int (*pf2)()))(){
return (int (*) ())((pf1() > pf2())*(int)pf1 + (pf2()>pf1())*(int)pf2);
}
void main(){
int res = h(f,g)();
}
我很难理解这个概要:
int (*h(int (*pf1)(), int (*pf2)()))()
我不明白这个外括号是什么意思->(* h(int(* pf1)(),int(* pf2)())
,并在函数签名的末尾加上括号()。
括号内的“ * h”又是什么?我知道它有两个功能并触发它。
我可以对以上问题进行简短的解释吗?
答案 0 :(得分:4)
函数指针可能很难读取。我从阅读最里面的括号开始,然后一直走到最外面的括号。
以下是该声明的细目分类:
int (*h(int (*pf1)(), int (*pf2)()))()
(*pf1)()
和(*pf2)()
是指向不接受任何参数(即())的函数的指针,并且它们都返回int
。
*h(int (*pf1)() , int (*pf2)())
是一个接受两个返回int
的函数指针的函数。因此,h返回指向不接受任何内容的函数的指针,并返回int
这里是一些语法示例的链接,以及更详尽的细分: https://www.cprogramming.com/tutorial/function-pointers.html
添加:
由于提供了段错误的原始代码,我编写了两个不同的实现,它们比较两个整数并返回较大的整数。
首先,查看j
。它只是一个常规函数,它接受恰好是函数指针的两个参数。这些函数指针然后在函数中使用。而且因为我们说j
返回了int
,所以我们通过用pf1()
调用pf2()
或()
来返回实际的整数。
现在看h
。在这种情况下,h
将返回指针*
。因此我们仍然在pf1()
中调用函数指针pf2()
和h
,但是当我们返回时,我们不要使用()
,因为我们想返回整个函数指针( pf1
或pf2
)。
最后,看看main,看看如何使用j
和h
之间的区别。同样,j
只是一个常规函数。但是,h
使用以下语法:h(f,g)(),因为h
返回指向一个函数的指针,然后我们要使用()
调用该函数以获取实际的整数结果用于打印。
希望这有助于通过工作示例提供更多的清晰度!祝你好运!
#include <stdio.h>
int f(){return 1;}
int g(){return 2;}
int j(int (*pf1)(), int (*pf2)())
{
return ((pf1() > pf2() ? pf1() : pf2()));
}
int (* h( int(*pf1)() , int(*pf2)() ) ) ()
{
return (pf1() > pf2() ? pf1 : pf2);
}
int main()
{
int res1 = j(f,g);
int res2 = h(f,g)();
//print values returned by calling f and g.
printf("f: %d \ng: %d\n", f(),g());
//print result of calling j(f,g)
printf("res1: %d\n", res1);
//print result of calling h(f,g)()
printf("res2: %d\n", res2);
return 0;
}
答案 1 :(得分:2)
main
调用h
返回的函数并返回该结果。 h
比较f
和g
的输出,并返回返回较大值的函数(否则返回0)。由于g
的输出大于f
,因此h
返回g
。因此main
返回2。