2012-07-05 6 views
6

Duplicar posibles:
Can main function call itself in C++?llamada recursiva en C++ principal

me encontré con este problema muy interesante, pero un poco ilusoria. Pregunta 6.42 C++ cómo programar por Dietel "¿Se puede llamar de manera recursiva en su sistema?" Escriba un programa que contenga una función principal. Incluya el conteo de variables locales estáticas e inicialice a 1. Incremente e imprima el valor de conteo cada vez que llamada. Compilar el programa. ¿Qué ocurre?

escribí el programa de la siguiente manera pero en vez hice la recursividad se detiene después de 10 veces como si fuera para que siga funcionando lo hará paradas en un valor alrededor de 41000.

Mi pregunta: ¿cómo es legal llamar recursivamente a la función principal en C++, si este programa se ejecuta para apilar sobre flujo o falla de memoria, etc.? Explique.

#include <iostream> 
using namespace std; 
int main() 
{ 
     static int count = 0; 
     count++; 
     if(count <= 10) { 
       cout << count << endl; 
       return main(); //call main 
       }//end if 

     system("pause"); 
     return 0;//successful completion 
}//end main 

que

Respuesta

17

gracias ¿Cómo es legal para llamar a la función recursiva main() en C++

No es legal. El estándar de lenguaje C++ establece que "La función main no se utilizará dentro de un programa" (C++ 11 §3.6.1/3). Llamar a la función es una forma de "uso".

Cualquier programa que llame a main() presenta un comportamiento indefinido (técnicamente, dicho programa está mal formado porque la regla violada es una regla semántica diagnosticable, aunque me sorprendería si la mayoría de los compiladores rechazaran el programa). Tenga en cuenta que esto no impide que la infraestructura de tiempo de ejecución que inicia su programa llame a la función main().

+3

Creo que también es útil citar las llamadas recursivas más legibles por humanos, pero menos generales, excepto para la función denominada main "de §5.2.2 [expr.call]/9 – Cubbi

+0

@James, gracias para su respuesta, si el estándar de C++ establece lo anterior, entonces, ¿por qué los compiladores permiten la llamada recursiva? Encontré un comportamiento extraño de comprender. Agradecería su respuesta. – Sinan

+1

No puedo responder eso para todos los compiladores, ya que solo estoy muy familiarizado con uno (Visual C++) y estoy familiarizado con algunos otros. Sin embargo, me atrevería a adivinar que 'main()' es tratado por el compilador como cualquier otra función. En Windows, 'main()' no es el punto de entrada llamado por el sistema operativo: no podría ser, porque el tiempo de ejecución de C tiene que trabajar para inicializar globales y preparar el entorno para su ejecución. Después de hacer esto, el tiempo de ejecución de C llama a su programa 'main()'. Entonces, realmente es solo otra función, pero _usted_ no tiene permitido llamarlo, solo el tiempo de ejecución de C puede llamarlo. –

Cuestiones relacionadas