size_t i = 10; i >= 0;
никогда не является ложным, так как size_t
- это некоторый тип без знака, и все значения больше или равны нулю.
... size_t
, который является целым числом без знака тип результата оператора sizeof
; ...
C11 §7.19 2
хороший компилятор с предупреждениями включен предупредил бы об этом.
Надеюсь, этот бесконечный цикл никогда бы не произошел, так как расследование этого предупреждения сначала устранило бы проблему.
Лучшая альтернатива зависит от кодирования целей
Хороший код позволяет избежать магических чисел, как этот голый 10. Лучше, если код, полученный этим. В этом простом случае, это должно было быть 11.
#define A_SIZE 11
int array[A_SIZE];
...
for (size_t i = A_SIZE; i-- > 0;) {
// Do something, f.ex. array[i] = i
}
OTOH, код, возможно, имел break
условия в цикле и нуждается i
в пожилом код для обозначения array[]
использований
size_t i = A_SIZE;
while (i > 0) {
if (...) break;
i--;
// Do something, f.ex. array[i] = i
if (...) break;
}
// Do something with i
код может иметь требование контракта использовать 10
в разных местах.
// Contract says loop must handle indexes 0 to N, inclusive
#define N 10
int array[N + 1];
for (size_t i = N; i + 1 > 0; i--) {
// Do something, f.ex. array[i] = i
}
Хорошие оптимизирующие компиляторы не будет выполнять +1
на каждом i + 1 > 0
, но создать эквивалентный эффективный код.
Код - это мода, которая наилучшим образом передает общее значение кода.
Это не технически переполнение, потому что 'size_t' является неподписанным типом, но это определенно бесконечный цикл, поскольку условие завершения всегда истинно. – chqrlie