そこで、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バージョンは、実際にはスタックがオーバーフローすることなく無限にループします。