При выполнении сравнения d <= (TOTAL_ELEMENTS-2)
выполняется преобразование типа . d
имеет тип signed int
, а (TOTAL_ELEMENTS-2)
имеет тип size_t
, который является беззнаковым типом. Правила C гласят, что когда у оператора есть аргумент со знаком и без знака, а аргумент без знака больше или равен размеру аргумента со знаком, тогда аргумент со знаком преобразуется в без знака.
То есть сравнение заканчивается как:
(size_t) d <= (TOTAL_ELEMENTS-2)
И поскольку size_t
без знака, (size_t) -1
- это действительно очень большое число, а не -1 больше. Для 32-разрядного size_t
это будет 2 32 - 1 = 4 294 967 295.
Чтобы исправить это, вы можете явно привести правую сторону к подписанному int:
d <= (int) (TOTAL_ELEMENTS-2)
Или, лучше, просто избавиться от странной отрицательной индексации и тому подобного.
Для дальнейшего использования включите все предупреждения компилятора , которые вы можете. Например, gcc напечатает предупреждение, если вы включите -Wall -Wextra
:
$ gcc -o arrayprint -Wall -Wextra -ansi arrayprint.c
arrayprint.c: In function ‘main’:
arrayprint.c:11: warning: comparison between signed and unsigned