我不知道哪里错了,但以下代码无法正确排序数组。
#include <stdio.h>
#include <stdlib.h>
int compare(const void* a, const void* b)
{
return (*(int*)a - *(int*)b);
}
int main()
{
int x[] = { -919238029,
-889150029,
-826670576,
-579609061,
-569653113,
-305140505,
-216823425,
-193439331,
-167683147,
-49487019,
-45223520,
271789961,
275570429,
444855014,
559132135,
612312607,
664554739,
677860351,
1005278191,
1031629361,
1089012280,
1115952521,
1521112993,
1530518916,
1907515865,
1931470931,
-1631034645,
-1593702794,
-1465300620,
-1263094822
};
int i;
qsort(x, 30, sizeof(int), compare);
for(i = 0; i < 30; i ++)
printf("%d\n", x[i]);
return 0;
}
会产生以下输出:
1521112993
1530518916
1907515865
1931470931
-1631034645
-1593702794
-1465300620
-1263094822
-919238029
-889150029
-826670576
-579609061
-569653113
-305140505
-216823425
-193439331
-167683147
-49487019
-45223520
271789961
275570429
444855014
559132135
612312607
664554739
677860351
1005278191
1031629361
1089012280
1115952521
我的意思是,问题一定在我的比较函数中。有人注意到任何奇怪的地方吗?
bool
的值在减法之前会被提升为int
类型。同样,在C和C++中,这种习惯用法对所有基本类型都是完全安全的。 - AnT stands with Russiava < vb? -1 : va > vb? 1 : 0
,它容易理解,易于反转,并且如果你有多个排序字段,很容易进行扩展。而Mehrdad的评论是准确的--有许多语言不会将布尔值隐式转换为整数(当然,这是一个C语言问题,但他笑了)。 - Jim Balter(va > vb) - (va < vb)
更加简单易懂。一开始可能看起来有些新颖,但它对称的性质使得它比使用不明显分组的?:
运算符更易读。 - AnT stands with Russia