Вы можете исправить конечное условие из вашего исходного кода. -1/2
гарантированно равно 0 в C99, что заставляет тело цикла выполняться один раз, поэтому вам может потребоваться обработать count == 1
особенно, если это все еще требуется для поведения, когда типы не подписаны.
size_t count = something;
if (count > 1) {
for (size_t start = (count-2)/2; start != SIZE_MAX; --start) {
someFunction(x, start, count);
}
}
Это работает, потому что мы знаем, что начальное значение start
не может быть SIZE_MAX
, потому что нет значения size_t
, которое при делении на 2 дает SIZE_MAX
.
Для более общих циклов, которые могут начинаться с SIZE_MAX
и идти до 0 включительно, очевидно, что мы не можем выполнить проверку на выход перед телом цикла, потому что мы хотим, чтобы тело цикла выполнялось один раз для каждого значение size_t
, поэтому нет значения, по которому мы можем выйти. Чтобы учесть этот случай:
size_t count = SIZE_MAX, start = SIZE_MAX;
do {
someFunction(x, start, count);
} while (start-- != 0);
Во всех случаях SIZE_MAX
можно заменить на -1
, что является более общим в том смысле, что оно преобразуется в максимальное значение каждого типа без знака, но приводит к запутанным вопросам .