Выполнение сравнения d <= (TOTAL_ELEMENTS-2)
, тип преобразования. d
имеет тип signed int
, а (TOTAL_ELEMENTS-2)
имеет тип size_t
, который является неподписанным. Правила C говорят, что когда оператор имеет подписанный и неподписанный аргумент, а аргумент unsigned имеет больший или равный размер для подписанного аргумента, то подписанный аргумент преобразуется в unsigned.
То есть, сравнение заканчивается как:
(size_t) d <= (TOTAL_ELEMENTS-2)
И потому size_t
беззнаковым, (size_t) -1
действительно, на самом деле большое количество, а не -1 больше. Для 32-битного size_t
это будет 2 - 1 = 4 294 967 295.
Чтобы это исправить, вы можете явно привести правую подписанному INT:
d <= (int) (TOTAL_ELEMENTS-2)
Или, лучше, просто избавиться от странной отрицательной индексации и тому подобное.
Для справок в будущем, включите все предупреждения компилятора вы можете. НКА, например, будет выдавать предупреждение, если вы включите -Wall -Wextra
:
$ gcc -o arrayprint -Wall -Wextra -ansi arrayprint.c
arrayprint.c: In function ‘main’:
arrayprint.c:11: warning: comparison between signed and unsigned
Почему не просто 'для (d = 0; d
fredoverflow
Возможно, это поучительный пример того, насколько сложно правильно программировать на C. И в связи с этим это действительно очень хороший пример. –
Этот вопрос является частью [головоломки Gowri Korumar's C] (http://www.gowrikumar.com/c/), сборник из 50 очень учебных вопросов C. Я ответил на первые 25 вопросов как от прошлых знаний, так и от исследований, в случае, если это помогает: [C головоломки ответил] (http://codeitdown.com/c-puzzles-answered/). – JoseV