三元和演员作为qs​​ort参数

时间:2016-01-02 08:43:08

标签: c

我正在尝试练习指向函数的指针,但我不理解使用的技术。

上下文:

char *lineptr[5000];
int strcmp (char *, char *);
int numcmp (char *, char *);`

函数原型是:

void qsort ( void *lineptr[], int left, int right, int (*comp)(void *, void *));

我不明白以下通话是如何运作的:

qsort((void**)lineptr ,0 , nlines-1, (int(*)(void*,void*))(numeric?numcmp:strcmp));

特别是这部分:

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

函数原型只有4个参数,而在函数调用中,有5个参数,第5个是方程式。这个编译没有错误。

有一次,我假设它会根据numcomp的值为函数指针strcmp分配(*comp)numeric。但我不明白的是这项任务将如何发生。

3 个答案:

答案 0 :(得分:4)

只传递4个参数,第4个参数

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

将传递指向numcmp的指针(如果numeric是真实的)或指向strcmp函数的指针(如果numeric是假的)。

(int (*)(void*, void*))只是对函数签名的强制转换,以帮助编译器,因为编译器期望(int (*)(void*, void*))作为函数指针(参见qsort函数原型)并且你是传入指向numcmp/strcmp (int (*)(char*, char*))的指针。

答案 1 :(得分:2)

只有4个参数:

qsort((void**)lineptr,0,nlines-1,(int(*)(void*,void*))(numeric?numcmp:strcmp));

分解为每行一行,看起来像:

qsort((void**)lineptr,
      0,
      nlines-1,
      (int(*)(void*,void*))(numeric?numcmp:strcmp));

最后一个似乎是令你困惑的那一个。 ?:表达式选择具有相同声明类型的两个函数之一:

numeric?numcmp:strcmp

然后将其括起来(用于优先级)并转换为带有两个void *参数的函数指针类型:

(int(*)(void*,void*))funcptr

强制转换操作符中的类型是一个指向函数的指针,该函数接受两个void *参数并返回int结果。

答案 2 :(得分:0)

qsort的最后一个参数有点复杂。

qsort((void**)lineptr,0,nlines-1,(int(*)(void*,void*))(numeric?numcmp:strcmp));
//                               |<--        one argument                 -->

以更详细的代码为代价,您可以将该行简化为

int(*compare_function)(void*,void*) = (int(*)(void*,void*))numcmp;
if ( !numeric )
{
   compare_function = (int(*)(void*,void*))strcmp;
}

qsort((void**)lineptr,0,nlines-1, compare_function);