Qu’est-ce qui empêche le tableau du code suivant d’être imprimé?

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 (et d’autres en-têtes).” – norme C99.

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; }