Question

Ceci est un petit morceau de code ci-dessous qui utilise do while. Je ne comprends vraiment le comportement inattendu que je vois quand j'exécuter ce code code.This ci-dessous utilise un état de faire en boucle et de ma connaissance a faire en boucles de telle exécute manière que si première exécute l'instruction et vérifie ensuite dans le tout partie si la condition est vraie ou not.But quand j'exécute ce code, il ne sort jamais de la boucle et se poursuit tout le monde forever.Can s'il vous plaît me dire pourquoi est-il passe?

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

           printf("hello\n");
          }

Maintenant, je ne me le "bonjour" imprimé.

Merci d'avance Maddy

Était-ce utile?

La solution

affiche « bonjour » pour moi. prend un certain temps (bien, une ou deux secondes).

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

Autres conseils

Comme les autres réponses disent, en comparant une valeur signée et non signée est une mauvaise idée (GCC en avertit si on leur donne les drapeaux à droite). La raison pour laquelle vous êtes coincé dans une « boucle infinie » est la valeur signée B est considérée comme non signé dans le but de la comparaison. La première fois que vous arrivez à while(B > A), B est -1 (il a commencé à 0 et a été décrémenté une fois). Lorsqu'ils sont traités comme non signé, il devient le plus grand entier possible, de sorte que la comparaison est vraie. Il reste pendant longtemps, de sorte que la boucle semble jamais finir. Finalement incrémenter et décrémenter A B les ferait passer l'autre et la boucle se terminerait, mais il faudra plus que vous aviez prévu

Vous comparez un entier non signé à un numéro de négatif. Essayez de mettre A en entier signé.

Comparant signé et non signé peut conduire à confondre le comportement. Vous devriez faire à la fois A et B du même type.

Vous comparez signé avec non signé. Mais vous verrez « bonjour » par la suite. A et B seront tous deux trop-plein pour faire B> Un faux.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top