5
double (*bar(int, double(*)(double,double[])))(double);

在查看演讲幻灯片时,我发现留给学生的练习:

bar简单来说,这个 C 声明中的类型是什么?

帮助我完成这个。我什至不知道从哪里开始,除了某些东西最终会返回双倍。

4

2 回答 2

10

如果您不确定是否始终可以使用 K&R 中描述的 cdecl 实用程序,如下所示:

$ cdecl
Type `help' or `?' for help
cdecl> explain double (*bar(int, double(*)(double,double[])))(double);
declare bar as function 
(int, pointer to function (double, array of double) returning double)
returning pointer to function (double) returning double

所以 bar 是一个函数,它接受一个int和一个指向一个函数的指针,该函数接受一个doubledouble[]返回一个double

double(*)(double,double[]))

bar 返回一个指向另一个函数的指针,该函数接受 adouble并返回 adouble

double(*)(double)
于 2012-11-27T20:26:50.787 回答
7

这个答案是通过使用螺旋法则的能力带给你的。能够通过从未知元素开始并阅读它来理解复杂的表达式(首先解决括号中的问题)。阅读代码时非常有用的技能。

        bar                                            - bar
        bar()                                          - is a function
        bar(int, )                                     - which takes an int...
        bar(int, (*)())                                - and a function pointer
        bar(int, double(*)())                          - which returns a double
        bar(int, double(*)(double, ))                  - and takes a double...
        bar(int, double(*)(double, double[]))          - and an array of doubles
      (*bar(int, double(*)(double, double[])))         - and returns a pointer
      (*bar(int, double(*)(double, double[])))()       - to a function
      (*bar(int, double(*)(double, double[])))(double) - taking a double
double(*bar(int, double(*)(double, double[])))(double) - which returns a double

那是艰难的方式......当然有一些网站可以让这更容易,例如cdecl网站;但是,即使您无法上网,也能够阅读代码是件好事。

于 2012-11-27T20:57:49.430 回答