Il y a quelque chose qui cloche dans le code ci-dessous … Quelqu’un pourrait-il m’expliquer quel est le problème et pourquoi?
#include #define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0])) int array[] = {23,34,12,17,204,99,16}; int main() { int d; for(d=-1;d <= (TOTAL_ELEMENTS-2);d++) printf("%d\n",array[d+1]); return 0; }
L’opérateur sizeof : …
“La valeur du résultat est définie par implementation et son type (un type entier non signé) est size_t, défini dans
Conversions : …
“Sinon, si l’opérande qui a un type entier non signé a un rang supérieur ou égal au rang du type de l’autre opérande, l’opérande avec le type entier signé est converti au type de l’opérande avec le type entier non signé.” – norme C99.
Le int d (-1) est converti en type (TOTAL_ELEMENTS-2) qui est le type sizeof return (un entier non signé). Cela se fait généralement en réinterprétant les bits comme une valeur non signée => -1 entier signé = 0xFFFFFFFF (si int a 32 bits) entier non signé.
Vous essayez de comparer 0xFFFFFFFF avec 0x5 (TOTAL_ELEMENTS-2) qui est faux.
Vous devriez avoir un avertissement … incompatibilité signé / non signé …
Norme C99
Conversions arithmétiques habituelles.
Dans l’expression <=
, la valeur int
-1
est convertie en un type non signé de sizeof
et devient une valeur énorme; l'expression <=
est alors fausse.
Utilisation:
for(d=-1;d <= (int) (TOTAL_ELEMENTS-2);d++)
Veuillez trouver les modifications ci-dessous
#comprendre
#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0])) int array[] = {23,34,12,17,204,99,16}; int main() { int d,k; k=TOTAL_ELEMENTS-2; for(d=-1;d <=k ;d++) printf("%d\n",array[d+1]); return 0; }