Question

Je jouais donc avec des expériences de pensée où j'imaginais ce qui se passerait lorsque deux fonctions sont devenues mutuellement récursives. Un tel était que si les deux fonctions pouvaient potentiellement tomber dans une boucle infinie.

À cette fin, j'ai pensé à ce simple exemple:

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

Fait intéressant, cela n'imprimera absolument rien si vous le compilez avec G ++. Compilez-le avec n'importe quel interrupteur -o et il tombe dans une boucle infinie.

Les pensées? Est-ce potentiellement un bug du compilateur, ou est-ce à prévoir? Je pense que dans le cas des optimisations -O, il se rendrait compte que Foo (x) et Bar (x) reviennent juste x.

Je ne m'attendais pas à ce qu'il "optimise" l'appel et ignore complètement l'impression "La valeur est" vers l'entrée standard.

EDIT: J'ai compilé ceci comme juste g ++ source.cpp (-o1 / 2/3), sous Cygwin en utilisant GCC 4.5.0. Les versions -ox bouclent en fait infiniment sans le débordement de la pile.

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top