2010-06-22 7 views
1

Ceci est un petit morceau de code ci-dessous qui utilise des boucles while. Je ne comprends vraiment pas le comportement inattendu que je vois quand j'exécute ce code.Ce code ci-dessous utilise une condition de boucle while et, à ma connaissance, une boucle while do s'exécute de telle sorte que si elle exécute d'abord l'instruction puis tout en partie si la condition est vraie ou non.Mais quand j'exécute ce code il ne sort jamais de la boucle et continue pour toujours.Peut-on me dire s'il vous plaît pourquoi est-ce qui se passe?Douteux dans un code utilisant la boucle while while

  unsigned int A = 5; 
      int B = 0; 
      main() 
      { 
       do 
       { 
        A = A + 5; 
        B = B - 1; 
       }while(B > A); 

      printf("hello\n"); 
      } 

Maintenant, je ne reçois jamais le "bonjour" imprimé.

Merci à l'avance Maddy

Répondre

-1

imprime "bonjour" pour moi. prend un moment (enfin, une seconde ou deux).

modifié à cette ...

void main() 
{ 
    unsigned int A = 5; 
    unsigned int loop = 0; 
    int B = 0; 
    do 
    { 
     A = A + 5; 
     B = B - 1; 
     loop++; 
    }while(B > A); 

    printf("hello %d %d %d\n", B, A, loop); 
} 

imprime: -

hello -715827882 -715827881 715827882 
+0

Merci beaucoup à tous.Il a fallu beaucoup de temps que prévu, mais finalement il avait imprimé "bonjour". – maddy

1

Vous comparez un unsigned int à un nombre négatif. Essayez de transformer A en int signé. La comparaison de signés et de non signés peut entraîner un comportement confus.

1

Vous devriez faire à la fois A et B du même type.

4

Comme les autres réponses disent, en comparant une valeur signée et non signée est une mauvaise idée (GCC avertit à ce sujet si on lui donne les bons drapeaux). La raison pour laquelle vous êtes bloqué dans une "boucle infinie" est que la valeur signée B est traitée comme non signée aux fins de la comparaison. La première fois que vous obtenez while(B > A), B est -1 (il a commencé à 0 et a été décrémenté une fois). Lorsqu'il est traité comme non signé, il devient le plus grand entier possible, donc la comparaison est vraie. Cela reste vrai pendant longtemps, donc la boucle semble ne jamais finir. En fin de compte, incrémenter A et décrémenter B les amènerait à se croiser et la boucle finirait, mais cela prendra plus de temps que prévu

+0

@Michael ... Merci pour la solution, mais ce que je suis un peu confus est de savoir comment un nombre signé -1 lorsqu'il est converti en un non signé devient le plus grand entier? Je veux dire de quelle manière la conversion est faite? – maddy

+0

@maddy - dans l'arithmétique à deux complément, la valeur signée -1 a un modèle binaire de tous les 1. Si vous interprétez ce modèle de bits comme non signé, il s'agira de la plus grande valeur représentable. –

+0

@maddy Les nombres généralement négatifs sont stockés dans un format appelé [complément à deux] (http://en.wikipedia.org/wiki/Two's_complement); il arrive que dans cette forme -1 est stocké comme 0xFFFFFFFF (sur les machines de 32 bits). Comme un nombre non signé, c'est le plus grand nombre possible –

0

Vous comparez signé avec unsigned. Mais vous verrez "bonjour" éventuellement. Comme A et B vont déborder pour rendre B> A faux.

+0

Ils n'en ont pas besoin, ils peuvent se croiser normalement (B est décrémenté de MAX_UINT alors que A est incrémenté de 0) –