だが、私はこのような単純な機能を持っているとしましょう:次のようにで短絡演算子と末尾再帰
int all_true(int* bools, int len) {
if (len < 1) return TRUE;
return *bools && all_true(bools+1, len-1);
}
この機能は、より明らかに末尾再帰形式に書き換えることができます。
int all_true(int* bools, int len) {
if (len < 1) return TRUE;
if (!*bools) return FALSE;
return all_true(bools+1, len-1);
}
論理的には、この2つの間にはゼロ差があります。 bools
にはTRUE
またはFALSE
しか含まれていないと仮定すると、まったく同じことを行います。
私の質問です:コンパイラは末尾再帰呼び出しのような第2の最適化をするために十分にスマートであるならば、それは「& &」短絡ことを考えると、それは同じように最初を最適化することを期待するのが妥当でしょうか?明らかに、非短絡演算子が使用された場合、ではなくはテール再帰となります。両方の式は演算子が適用される前に評価されるためですが、短絡したケースが不思議です。
(私は、Cコンパイラが通常はテール再帰呼び出しを最適化しないという洪水を受ける前に、言語に関係なく、短絡演算子による末尾再帰呼び出しの最適化に関する一般的な質問と考えてください。私はスキーム、ハスケル、OCaml、F#、Python、またはあなたがCを理解していない場合はあなたのために他に何があったかを書き直して幸せになるでしょう)
gccは再帰呼び出しを最適化します。 – Arafangion