¿Por qué la salida es 0000 y cómo? [duplicate]

4 minutos de lectura

avatar de usuario
RaaJiv Yadav

Ejecuté este programa y no puedo entender por qué la salida es “0” cuatro veces. ¿Alguien puede ayudarme a entender cómo funciona? No entiendo por qué “printf” se ejecuta cuando falla la condición y por qué se ejecuta cuatro veces.

int main() 
{
    static int i=5; 
    if(--i)
    {
        main(); 
        printf("%d ",i);
    }
}

  • por favor sangría apropiada y palabras completas

    – Niko

    30/10/2013 a las 19:26

  • en realidad es un duplicado exacto

    – Niko

    30/10/2013 a las 19:31

  • @niko jeje… Se ha preguntado muchas veces en SO 🙂 Déjenme encontrar más… ¡La gente necesita mejorar sus habilidades en googlefu!

    – PP

    30/10/2013 a las 19:32


  • Algunos aquí: 1) stackoverflow.com/questions/18964387/… 2) stackoverflow.com/questions/17785765/… 3) stackoverflow.com/questions/18518915/main-calling-main

    – PP

    30/10/2013 a las 19:34

  • También tenga en cuenta en c++ el estándar dicta que usted debe no llamada main() dentro de su programa. Válido en c aunque.

    – José

    30/10/2013 a las 19:41

avatar de usuario
Giuseppe Pes

Su función principal imprime 4 veces 0 porque la declaración printf ocurre después de la llamada recursiva y i es una variable estática. Una variable estática se inicializa solo una vez y no se destruye después de que finaliza la función, ya que no se asigna a la pila de funciones.
Como resultado, el valor de i utilizado por el printf es siempre 0 como i se decrementa cada vez main se llama y el primero printf la función se ejecuta después de que la función más profunda ha regresado porque i=0.

Para comprender mejor esta solución, veamos la llamada de pila:

main() i=5 (First call)  
      if(4) // True
      main() (Second call) 
        if(3) // True
        main() (Third  call)
          if(2) // True
            main() (Forth call) 
               if(1) // True
                 main() (Fifth call)
                    if(0) //False End recursion No print because the condition is false
                 return
                print(i) // 0 (Forth Call)
            print(i) // 0 (Third  call)
         printf(i) // 0  (Second call) 
      print(i) // 0 (First call) 

los main se llama 5 veces pero la aplicación imprime 4 ceros porque la última llamada no imprime nada como la if la condición es falsa.

  • Entiendo todo lo que es estático, por lo que se inicializa una vez en el programa, pero cada vez que se llama a main() antes de printf y en la última condición es falso, por lo que no ingresaremos en el bloque if Entonces, ¿cómo se ejecuta printf?

    – RaaJiv Yadav

    31/10/2013 a las 14:05

  • He actualizado mi respuesta. Avísame si ahora está más claro.

    – Giuseppe Pes

    31/10/2013 a las 15:20

  • Sí, gracias, señor, pero ¿puede explicarme una cosa más? Si eliminamos la palabra clave estática, ¿por qué se convierte en una llamada infinita? Según yo, si eliminamos solo las palabras clave estáticas, debería imprimir 1234

    – RaaJiv Yadav

    1 de noviembre de 2013 a las 18:45

  • si quitas static desde el ila función nunca llega al final de la recursividad porque para cada llamada de función i=5, por lo tanto, el if siempre es verdadero y se realiza otra llamada a main.

    – Giuseppe Pes

    1 de noviembre de 2013 a las 19:49

  • Oh, olvidé la propiedad de la estática. Ok, gracias

    – RaaJiv Yadav

    2 de noviembre de 2013 a las 5:06

i es estático por lo que se inicializa solo una vez. Cada vez que llamas main se decrementa cuando i == 1 entonces el `si la condición de la declaración será falso aquí:

if(--i)

la recursión se detendrá y i sera 0la recursión se desenrollará y el programa imprimirá cuatro 0s.

En aras de la exhaustividad, el borrador de la sección estándar C99 6.2.4 Duraciones de almacenamiento de objetos párrafo 3 dice(énfasis mío):

Un objeto cuyo identificador se declara con enlace externo o interno, o con la clase de almacenamiento especificador estático tiene una duración de almacenamiento estática. Su tiempo de vida es la ejecución completa del programa y su almacenamiento el valor se inicializa solo una vez, antes del inicio del programa.

  • Entiendo todo lo que es estático, por lo que se inicializó una vez en el programa, pero aún no puedo entender que printf no tenga la oportunidad de ejecutarse, pero está imprimiendo el valor, ¿cómo?

    – RaaJiv Yadav

    31 de octubre de 2013 a las 14:02

  • @RaaJivYadav antes de cada printf hay una llamada recursiva a main y asi el primero printf no se alcanzará hasta que finalice la recursión, lo que sucederá cuando i == 1.

    – Shafik Yaghmour

    31/10/2013 a las 14:05

  • Sí, antes de printf hay una llamada recursiva a main, por lo que el control llegará a main, luego nuevamente ingresará a if Condition, luego nuevamente el control llegará a main antes de printf y cuando i == 1, if (–i) se verá como si ( 0) entonces el control no entrará en si la condición y el programa terminarán. Entonces, ¿cómo es posible ejecutar el printf?

    – RaaJiv Yadav

    31 de octubre de 2013 a las 14:18

  • @RaaJivYadav cuando el código se cae al final de main se volverá a la invocación anterior de main y continuar ejecutando donde lo dejó, que era justo antes printf y lo hará para cada nivel de recursividad en este caso 4 niveles

    – Shafik Yaghmour

    31/10/2013 a las 14:50

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad