Lorsque vous effectuez la comparaison d <= (TOTAL_ELEMENTS-2)
, une conversion de type est effectuée. d
est de type signed int
tandis que (TOTAL_ELEMENTS-2)
est de type size_t
, qui est un type non signé. Les règles de C indiquent que lorsqu'un opérateur a un argument signé et un argument non signé, et que l'argument non signé est de taille supérieure ou égale à l'argument signé, alors l'argument signé est converti en unsigned.
C'est, la comparaison se termine comme:
(size_t) d <= (TOTAL_ELEMENTS-2)
Et parce que size_t
est non signé, (size_t) -1
est un nombre vraiment, vraiment grand, pas -1 plus. Pour un size_t
32 bits, ce serait 2 - 1 = 4,294,967,295.
Pour résoudre ce problème, vous pouvez convertir explicitement le côté droit de signé int:
d <= (int) (TOTAL_ELEMENTS-2)
Ou, mieux, simplement se débarrasser de l'indexation négative bizarre et tel.
Pour référence ultérieure, activez tous les avertissements du compilateur vous pouvez. gcc, par exemple, affichera un avertissement si vous activez -Wall -Wextra
:
$ gcc -o arrayprint -Wall -Wextra -ansi arrayprint.c
arrayprint.c: In function ‘main’:
arrayprint.c:11: warning: comparison between signed and unsigned
Pourquoi ne pas simplement 'pour (d = 0; d
fredoverflow
Peut-être est-ce un exemple instructif de la difficulté de programmer correctement en C. Et à ce titre, c'est en effet un très bon exemple. –
Cette question fait partie de [C puzzles de Gowri Korumar] (http://www.gowrikumar.com/c/), une compilation de 50 questions C très éducatives. J'ai répondu aux 25 premières questions à la fois des connaissances et des recherches passées, au cas où cela aiderait: [C puzzles répondu] (http://codeitdown.com/c-puzzles-answered/). – JoseV