Pregunta

Así que estaba jugando con algunos experimentos de pensamiento en los que imaginaba lo que sucedería cuando dos funciones se volvieron mutuamente recursivas. Una de esas era si ambas funciones pudieran caer en un bucle infinito.

Con ese fin, pensé en este simple ejemplo:

#include <iostream>
#include <cstdlib>

int foo(int x);
int bar(int x);


int foo(int x)
{
    return bar(x + 1);
}

int bar(int x)
{
    return foo(x - 1);
}

int main(int argc, char **argv)
{
    if (argc > 1)
        std::cout << "The value is: " << foo(atoi(argv[1])) << std::endl;

    return 0;
}

Curiosamente, esto realmente imprimirá absolutamente nada si lo compilas con G ++. Compile con cualquier interruptor -o y cae en un bucle infinito.

¿Pensamientos? ¿Es esto potencialmente un error del compilador, o es de esperar esto? Pensaría en el caso de -o optimizaciones, se daría cuenta de que Foo (x) y bar (x) regresan solo x.

No esperaba que realmente "optimice" la llamada e ignore por completo la impresión "El valor es" para la entrada estándar.

Editar: compilé esto como solo G ++ Source.cpp (-O1/2/3), en Cygwin usando GCC 4.5.0. Las versiones -OX en realidad se vuelven infinitamente sin el desbordamiento de la pila.

No hay solución correcta

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