Domanda

Questo è un piccolo pezzo di codice riportato di seguito che sta usando do while. Ho davvero non capisco il comportamento imprevisto che vedo quando eseguo questo codice code.This mostrato di seguito utilizza un DO WHILE condizione del ciclo e dalla mia conoscenza a fare cicli while viene eseguito in modo tale che, se prima esegue l'istruzione e poi controlli nel mentre parte se la condizione è vera o not.But quando eseguo questo codice non viene mai fuori dal giro e va a nessuno forever.Can dirmi perché sta succedendo?

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

           printf("hello\n");
          }

Ora non ho mai ottenere il "ciao" stampato.

Grazie in anticipo Maddy

È stato utile?

Soluzione

stampe "ciao" per me. prende un mentre (pozzo, uno o due secondi).

modificato per questo ...

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

stampe fuori: -

hello -715827882  -715827881 715827882

Altri suggerimenti

Come dicono le altre risposte, confrontando un valore con segno e senza segno è una cattiva idea (GCC vi avvertirà a questo proposito se dato le bandiere a destra). La ragione per cui sei bloccato in un "loop infinito" è il valore con segno B viene trattato come senza segno ai fini del confronto. La prima volta che si arriva a while(B > A), B è -1 (ha cominciato a 0 ed è stato decrementato una volta). Quando trattata come senza segno, diventa il più grande intero possibile, quindi il confronto è vero. Rimane vero per lungo tempo, in modo che il ciclo sembra non finire mai. Alla fine l'incremento A e decrementare B causerebbe loro di passare l'un l'altro e il ciclo sarebbe finito, ma ci vorrà più tempo di quanto previsto

Si sta confrontando un unsigned int ad un numero negativo. Provare a girare A in un int firmato.

Paragonando con e senza segno può portare a confondere il comportamento. Si dovrebbe fare sia A e B dello stesso tipo.

si sta confrontando firmato con unsigned. Ma vedrete "ciao" alla fine. Come A e B saranno entrambi troppo pieno per fare B> Un falso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top