Я вижу, что многие люди используют вычитание в функции компаратора qsort. Я думаю, что это неправильно, потому что, имея дело с этими числами: int nums[]={-2147483648,1,2,3}; INT_MIN = -2147483648;
int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
Я написал эту функцию для проверки:
#include <stdio.h>
#include <limits.h>
int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
int main(void)
{
int a = 1;
int b = INT_MIN;
printf("%d %d\n", a,b);
printf("%d\n",compare((void *)&a,(void *)&b));
return 0;
}
Результат:
1 -2147483648
-2147483647
но a > b
, поэтому результат должен быть положительным。 Я видел много книг, написанных подобным образом. Я считаю, что это неправильно; при работе с int
типами это должно быть написано так:
int compare (const void * a, const void * b)
{
if(*(int *)a < *(int *)b)
return -1;
else if(*(int *)a > *(int *)b)
return 1;
else
return 0;
}
Я просто не могу понять, почему многие книги и веб-сайты пишут в такой вводящей в заблуждение манере. Если у вас другое мнение, дайте мне знать.
qsort()
, переполнение целочисленного сигнала - неопределенное поведение, чего вы ожидали? тоже естьINT_MAX
и1 + INT_MIN
переполнение. - person Stargateur   schedule 05.04.20181 - (-INT_MIN) == 1 + INT_MIN
- person Stargateur   schedule 05.04.20181 + INT_MIN
не должно переполняться.1 + INT_MAX
переполняется.INT_MIN - 1
переполняется. - person Jonathan Leffler   schedule 05.04.2018INT_MIN
до-2147483648
, но я сохраняюINT_MIN
по какой-то непонятной причине - person Stargateur   schedule 05.04.2018