代码之家  ›  专栏  ›  技术社区  ›  Michael

我有C语言语法问题

c
  •  0
  • Michael  · 技术社区  · 7 年前

    我用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 回复  |  直到 7 年前
        1
  •  4
  •   Jagawag    7 年前

    函数指针可能很难读取。我从最里面的圆括号开始,一直读到最外面的圆括号。

    下面是这份声明的细目:

    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


    补充:

    由于提供了Sebug的原始代码,我编写了两个不同的实现,比较两个整数并返回较大的整数。

    首先,看看 j . 它只是一个规则函数,它接受两个恰好是函数指针的参数。然后在函数中使用这些函数指针。因为我们说过 J 返回一个 int ,我们通过调用 pf1() pf2() 具有 () .

    现在看看 h . 在这种情况下, H 将返回一个指针 * . 所以我们仍然调用函数指针 PF1() PF2() 在里面 H ,但当我们返回时,我们不使用 () 因为我们想返回整个函数指针(或者 pf1 pf2 )。

    最后,看看main,看看 J H 被使用。再一次, J 只是一个常规函数。然而, H 使用this语法: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;
    }
    
        2
  •  2
  •   stark    7 年前

    main 调用 h 并返回结果。 H 比较的输出 f g 返回返回较大值的函数(否则返回0)。因为 G 大于 f , H 收益率 G . 因此 主要的 返回2。