带括号的三元表达式的解释,在C中的函数指针声明中返回函数名称

问题描述 投票:0回答:1

在K&R2书中,在函数指针部分的第119页上,有一个函数指针的以下参数声明:

(int (*)(void*,void*))(numeric ? numcmp : strcmp)

[numcmpstrcmp是函数名,numeric是一个布尔变量,它决定表达式所声明的函数指针所指向的这两个函数中的哪一个。

我不知道这是如何以及为什么起作用。如果我试图写这个表达式,我的尝试将更像是:

int (*(numeric ? numcmp : strcmp))(void*,void*)

我能理解K&R构造的最好方法是,第一个带括号的部分-(int (*)(void*,void*))-充当函数,第二个带括号的部分[(numeric ? numcmp : strcmp)-充当函数参数,整个返回函数指针宣言。但是,以这种方式来考虑它与我所学到的C语言没有任何联系。

我已经阅读了一些有关如何理解C中复杂指针表达式的优秀指南。您基本上从最里面的表达式向外“螺旋”出来。但这让我感到难过,它不符合要求。有人可以解释一下吗?

c function pointers function-pointers conditional-operator
1个回答
2
投票

(int (*)(void*,void*))是普通的type-cast

如果我们创建类型别名

typedef (int (*function_type)(void*,void*));

使用起来可能会更容易理解:

(function_type) (numeric ? numcmp : strcmp)

简而言之,三元表达式返回指向函数的指针,然后将结果(函数指针)转换为特定类型。

© www.soinside.com 2019 - 2024. All rights reserved.