在K&R2书中,在函数指针部分的第119页上,有一个函数指针的以下参数声明:
(int (*)(void*,void*))(numeric ? numcmp : strcmp)
[numcmp
和strcmp
是函数名,numeric
是一个布尔变量,它决定表达式所声明的函数指针所指向的这两个函数中的哪一个。
我不知道这是如何以及为什么起作用。如果我试图写这个表达式,我的尝试将更像是:
int (*(numeric ? numcmp : strcmp))(void*,void*)
我能理解K&R构造的最好方法是,第一个带括号的部分-(int (*)(void*,void*))
-充当函数,第二个带括号的部分[(numeric ? numcmp : strcmp)
-充当函数参数,整个返回函数指针宣言。但是,以这种方式来考虑它与我所学到的C语言没有任何联系。
我已经阅读了一些有关如何理解C中复杂指针表达式的优秀指南。您基本上从最里面的表达式向外“螺旋”出来。但这让我感到难过,它不符合要求。有人可以解释一下吗?
(int (*)(void*,void*))
是普通的type-cast。
如果我们创建类型别名
typedef (int (*function_type)(void*,void*));
使用起来可能会更容易理解:
(function_type) (numeric ? numcmp : strcmp)
简而言之,三元表达式返回指向函数的指针,然后将结果(函数指针)转换为特定类型。