Подтвердить что ты не робот

Почему zlib пытается вычислить только положительную разницу указателей?

В zlib 1.2.7, файле inffast.c, строка 320, есть инструкция, которую я не понимаю:

strm->avail_out = (unsigned)(out < end ?
                             257 + (end - out) : 257 - (out - end));

Переменные end и out являются двумя указателями в выходной буфер. Этот оператор пытается вычислить end - out, когда end > out и out - end, когда out >= end, но я не понимаю, почему это может понадобиться. Мне кажется, что конечный результат тот же, т.е. Строка также может быть написана:

strm->avail_out = 257 + (end - out);

Разность двух указателей имеет подписанный интегральный тип ptrdiff_t (C99 6.5.6: 9), а 257 имеет тип int. Добавление происходит в типе более высокого ранга между этими двумя, и я не вижу, что троичный оператор мог бы защищать.

4b9b3361

Ответ 1

Ваши наблюдения верны для C99, а также C89/C90.

Эта строка кода была написана десять лет назад. В этот момент моя память позволяет мне только иметь возможность требовать паранойю в качестве оправдания. По-видимому, меня беспокоило, что в некоторых компиляторах результат вычитания двух указателей может быть неподписанным. Я не помню происхождение этой проблемы или если у нее вообще была какая-то основа.

Что касается истории изменений , эта строка кода родилась от бровь Зевса, как вы видите сегодня. Он не был изменен с момента его написания.