40 votes

Opérateur sizeof () dans l'instruction if

      #include <stdio.h>
     main()
     {
         if (sizeof(int) > -1)
             printf("True");
         else
             printf("False");
     }
 

Il imprime False . Pourquoi sizeof () ne renvoie-t-il pas une valeur dans les if ?

55voto

unwind Points 181987
  1. sizeof n'est pas une fonction, c'est un opérateur. Les parenthèses ne font pas partie du nom de l'opérateur.
  2. Il ne fonctionne pas parce que la valeur générée est le type non signé size_t, ce qui provoque "l'habitude de l'arithmétique conversions" à qui -1 , est converti en unsigned, dans ce cas, c'est un très grand nombre.

Fondamentalement, vous êtes en comparant 4 > 0xffffffffu, ou quelque chose de proche de que les au moins. Voir cette question pour plus de détails.

12voto

Lundin Points 21616
  • Les opérandes de l'opérateur > dans l'instruction if sont sizeof(int) et -1.
  • sizeof(int) est de type size_t, qui est garanti pour être un entier non signé. Il sera au moins aussi grand que unsigned int.
  • -1 est de type int, ce qui est équivalent à signed int.
  • Aucun entier promotions se produire, comme les deux opérandes sont d'assez grands types d'entiers.
  • Puis les deux opérandes sont symétriques selon un C règle officiellement appelé l'habitude de l'arithmétique des conversions.

Ces état (C11 6.3.1.8):

...

Sinon, si le type de l'opérande de type entier signé représenter l'ensemble des valeurs du type de l'opérande avec unsigned de type entier, puis l'opérande de type entier non signé est converti le type de l'opérande de type entier signé.

Sinon, les deux les opérandes sont convertis en type entier non signé correspondant à le type de l'opérande de type entier signé.

  • Le dernier de la ci-dessus va se passer, car un (signé) int ne peut pas s'adapter à toutes les valeurs de a, size_t.
  • Ainsi, -1 , est converti en un entier non signé. Dans la pratique, size_t est probablement équivalent à soit unsigned int ou unsigned long. Quoi qu'il arrive lorsque vous stockez -1 dans une telle variable est mise en œuvre définies par le comportement.
  • Sur un complément à deux ordinateur (99,9% de tous les ordinateurs dans le monde), -1 sera interprété comme 0xFFFFFFFF (le nombre de FF dépend de la taille d'un int sur le système).
  • 4 > 0xFFFFFFFF a la valeur false.

1voto

aec Points 102

Juste tester ceci et voir par vous-même

 #include <stdio.h>
main() {
    unsigned int a=4;
    int b = -1;
    //this is what you're doing
    printf("%u vs %u\n", a, (unsigned int)b);
    //this is what you want to do instead
    printf("%d vs %d\n", (int)a, b);
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X