我有C语言语法问题

时间:2018-06-20 21:12:58

标签: c

我用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”又是什么?我知道它有两个功能并触发它。

我可以对以上问题进行简短的解释吗?

2 个答案:

答案 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,但是当我们返回时,我们不要使用(),因为我们想返回整个函数指针( pf1pf2)。

最后,看看main,看看如何使用jh之间的区别。同样,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比较fg的输出,并返回返回较大值的函数(否则返回0)。由于g的输出大于f,因此h返回g。因此main返回2。