请问三目运算符的结果是怎么飞进去的?(内详)

上帝无言 2011-06-15 01:24:10

#include <stdio.h>
#include <string.h>
#define MAXLINES 5000 /* 待排序的最大行数*/
char *lineptr[MAXLINES]; /* 指向文本行的指针*/

int readlines(char *lintptr[ ], int nlines);
void writelines(char *lineptr[ ], int nlines);

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

main(int argc, char *argv[ ])
{
int nlines;
int numeric = 0;

if (argc > 1 && strcmp(argv[1], "-n ") = = 0)
numeric = 1;
if ((nlines = readlines(lineptr, MAXLINES)) >= 0) {
qsort((void **) lineptr, 0, nlines-1,
(int (*)(void *, void *)) (numeric ? numcmp : strcmp)); //这里不明白!
writelines(lineptr, nlines);
return 0;
}else {
printf("input too big to sort\n");
return 1;
}
}

qsort((void **) lineptr, 0, nlines-1,
(int (*)(void *, void *)) (numeric ? numcmp : strcmp));
后面的三目运算结果: (int (*)(void *, void *)) (numcmp)
我觉得应该这么写啊(int (*(numeric ? numcmp : strcmp) )(void *, void *))
请问如果是例子里那么写的话后面的结果怎么可能 飞进里面呢?
...全文
128 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
上帝无言 2011-06-15
  • 打赏
  • 举报
回复
我明白了,就是定义的这种函数指针类型 这里的作用 只把对方参数指针类型转换了,
刚看到函数指针,闹笑话了哦。
上帝无言 2011-06-15
  • 打赏
  • 举报
回复
因为不需要在别的地方引用,所以例子里连名字都省了吗, 晕死了
上帝无言 2011-06-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dizuo 的回复:]
C/C++ code
typedef int (*ComFuncType)(void *, void *);
qsort((void **) lineptr, 0, nlines-1,
(ComFuncType)(numeric ? numcmp : strcmp));

这样更加明了点,
[/Quote]
你写的是这个(*ComFuncType)类型,那例子里的就是(*)没有名字的类型了,是吧
ryfdizuo 2011-06-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 a590687 的回复:]

C/C++ code

(int (*)(void *, void *));


谢谢你啊,我还有点不理解转换过程
前面的int是转换返回值?后面参数表里的是转换参数指针类型? 是这么理解吗。
还是只转换后面的指针参数。
[/Quote]
numcmp,strcmp不是一般的指针,是函数指针,函数指针包含函数参数和返回值类型。
typedef int (*ComFuncType)(void *, void *); 这整体是一个类型ComFuncType
hu7324829 2011-06-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dizuo 的回复:]
C/C++ code
typedef int (*ComFuncType)(void *, void *);
qsort((void **) lineptr, 0, nlines-1,
(ComFuncType)(numeric ? numcmp : strcmp));

这样更加明了点,
[/Quote]
++
只是一个强制转换
如此美丽的你 2011-06-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dizuo 的回复:]

是把三目运算符的结果 numcmp : strcmp,函数指针,做一个强制类型转化么。
(int (*)(void *, void *)) 表示函数指针类型。
[/Quote]
en!!
上帝无言 2011-06-15
  • 打赏
  • 举报
回复

(int (*)(void *, void *));

谢谢你啊,我还有点不理解转换过程
前面的int是转换返回值?后面参数表里的是转换参数指针类型? 是这么理解吗。
还是只转换后面的指针参数。
luciferisnotsatan 2011-06-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dizuo 的回复:]

是把三目运算符的结果 numcmp : strcmp,函数指针,做一个强制类型转化么。
(int (*)(void *, void *)) 表示函数指针类型。
[/Quote]
++

(int (*)(void *, void *)) 函数类型为 两个void *参数,返回int
ryfdizuo 2011-06-15
  • 打赏
  • 举报
回复
typedef int (*ComFuncType)(void *, void *);
qsort((void **) lineptr, 0, nlines-1,
(ComFuncType)(numeric ? numcmp : strcmp));

这样更加明了点,
ryfdizuo 2011-06-15
  • 打赏
  • 举报
回复
是把三目运算符的结果 numcmp : strcmp,函数指针,做一个强制类型转化么。
(int (*)(void *, void *)) 表示函数指针类型。

70,021

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧