2026-09-19
three_way_cmp.c
#include <stdio.h>
#include <stdlib.h>
int cmp_int(const void *a, const void *b) {
int x = *(const int *)a;
int y = *(const int *)b;
return (x > y) - (x < y);
}
int main(void) {
int values[] = {5, -3, 5, 0, 2, -3};
qsort(values, 6, sizeof(int), cmp_int);
for (int i = 0; i < 6; i++)
printf("%s%d", i ? " " : "", values[i]);
printf("\n");
}
cmp_intはx - yではなく(x > y) - (x < y)を使っています。qsortしたあとの出力は何でしょうか?
Answer
-3 -3 0 2 5 5(その後に改行)。(x > y) - (x < y)は、xとyの大小関係だけから-1・0・1を作る式で、x - yのように途中でオーバーフローする心配がありません。この式は「xが大きいなら正、小さいなら負、等しいなら0」という一貫した規則を常に守るので、qsortが要求する全順序(同値を許すので正確には弱順序)としてそのまま使えます。valuesには5と-3がそれぞれ2つずつありますが、同じ値同士はどちらが先に並んでも出力される文字列は変わらないので、qsortの実装がタイをどう並べるかを気にする必要はありません。結果は昇順の-3 -3 0 2 5 5に確定します。