【发布时间】:2015-05-01 23:39:39
【问题描述】:
我目前正在完成 K&R 练习,但有些事情困扰着我。
我有qsort 函数声明:
void qsort(void *v[], int left, int right,
int (*comp)(void *, void *));
按照书上的说法,我应该可以使用条件表达式来选择比较函数。我有两个:
int numcmp(char *s1, char *s2)
和 cstring 的
int strcmp(const char *s1, const char *s2);
调用看起来像:
qsort((void **)lineptr, 0, nlines - 1,
(int(*)(void *, void *))(numeric ? numcmp : strcmp));
我的 MS VS 给了我一个错误:
Error: operand types are incompatible
然而,当我这样做时:
qsort((void **)lineptr, 0, nlines - 1,
(numeric ? (int(*)(void *, void *))numcmp : (int(*)(void *, void *))strcmp));
一切正常。
这本书是错的,还是只是VS的想法应该怎么做?
【问题讨论】:
-
有什么令人惊讶的地方?当两个参数都不能隐式转换为其他类型时,条件运算符不能接受 2 个参数,但您可以自然地将它们预先转换为相同的类型。
-
Ternary operator的可能重复
-
我没有使用标准库的 qsort。该声明来自作者编写的函数。定义也在那里。令人惊讶的是,作者在书中使用了第一种方式。而且我想知道这本书中的代码是否太老了以至于不能被 VS 接受,或者我在这里做错了什么。
-
请注意,如果您将传递的函数指针转换为
qsort,则说明您使用错误。 c-faq.com/lib/qsort2.html
标签: c pointers casting conditional-operator kernighan-and-ritchie