私がこのような単純な関数を持っているとしましょう:
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コンパイラは通常、末尾再帰呼び出しを最適化しないというコメントが殺到する前に、これは、言語に関係なく、短絡演算子を使用した末尾再帰呼び出しの最適化に関する一般的な質問だと考えてください。これをScheme、Haskell、OCaml、F#、Python、またはCを理解していない場合は、これまでにないもので書き直してください。)