double (*bar(int, double(*)(double,double[])))(double);
在查看讲义幻灯片时,我发现留给学生的练习:
用简单易懂的语言说明这个C声明中
bar
的类型是什么?
请帮忙给我讲解一下。除了最后会返回一个double之外,我甚至不知道从哪里开始。
double (*bar(int, double(*)(double,double[])))(double);
在查看讲义幻灯片时,我发现留给学生的练习:
用简单易懂的语言说明这个C声明中
bar
的类型是什么?
请帮忙给我讲解一下。除了最后会返回一个double之外,我甚至不知道从哪里开始。
如果您不确定,您可以始终使用 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
和一个指向一个函数的指针,该函数接受一个double
和double[]
,并返回一个double
:
double(*)(double,double[]))
并且bar返回一个指针,它指向另一个接受一个double
并返回一个double
的函数。
double(*)(double)
cdecl
的输出并不更容易阅读/理解,因为它只是另一种类型的纯文本代码,而不是人类大脑本地的AST。 - user529758本答案由使用螺旋规则的能力带给您。通过从未知元素开始阅读并在其周围阅读(首先解决括号内的内容),能够理解复杂表达式是一项非常有用的技能,特别是在阅读代码时。
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网站;但即使没有网络连接,能够阅读代码也是很重要的。