質問

それで、私はいくつかの思考実験で遊んでいました。そこでは、2つの機能が相互に再帰的になったときに何が起こるか想像していました。そのようなものの1つは、両方の機能が潜在的に無限のループに分類される可能性がある場合です。

そのために、私はこの簡単な例を考えました:

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

興味深いことに、G ++でコンパイルした場合、これは実際には絶対に印刷されません。任意の-oスイッチでコンパイルすると、無限のループに分類されます。

考え?これは潜在的にコンパイラのバグですか、それとも予想されますか? -oの最適化の場合、foo(x)とbar(x)がxを返すことに気付くと思います。

私はそれが実際に呼び出しを「最適化」し、値を「標準入力」に完全に無視することを期待していませんでした。

編集:GCC 4.5.0を使用してCygwinを使用して、G ++ source.cpp(-o1/2/3)のみとしてこれをコンパイルしました。 -oxバージョンは、実際にはスタックがあふれることなく無限にループします。

正しい解決策はありません

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top