Pregunta

Esta es una pequeña pieza de código se muestra a continuación que está utilizando bucle do. Realmente no entiendo el comportamiento inesperado que veo cuando ejecuta este código code.This se muestra a continuación utiliza un Do While condición de bucle y de mi conocimiento un bucle do se ejecuta de tal manera que si ejecuta primero el texto y haga comprobaciones en el tiempo parte, si la condición es verdadera o not.But cuando yo haga este código nunca se sale del bucle y continúa forever.Can alguien por favor dime por qué está sucediendo?

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

           printf("hello\n");
          }

Ahora que nunca sale el "hola" impreso.

Gracias de antemano Maddy

¿Fue útil?

Solución

impresiones "hola" para mí. toma un tiempo (bueno, un segundo o dos).

modificado para esto ...

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

Otros consejos

Como dicen las otras respuestas, la comparación de un valor con signo y sin signo es una mala idea (GCC le advertirá de ello si se dan las banderas de la derecha). La razón por la que está atrapado en un "bucle infinito" es el valor con signo B es tratado como sin firmar con el propósito de la comparación. La primera vez que se llega a while(B > A), B es -1 (comenzó a 0 y se decrementa una vez). Cuando se trata como sin firmar, se convierte en el mayor entero posible, por lo que la comparación es verdadera. Sigue siendo cierto durante mucho tiempo, por lo que el bucle parece no tener fin. Eventualmente incrementar A y decrementar B haría que se pasan entre sí y el bucle se acabaría, pero se necesitará más tiempo de lo previsto

Usted está comparando un entero sin signo de un número negativo. Prueba a activar A en un int firmado.

Comparando con y sin signo puede llevar a confundir el comportamiento. Usted debe hacer tanto A y B del mismo tipo.

que está comparando iniciado sesión con signo. Pero verá "hola" con el tiempo. Como A y B será desbordamiento de hacer B> Un falso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top