Operadores de cortocircuito y recursión de cola

Digamos que tengo una función simple como esta:

int all_true(int* bools, int len) {
    if (len < 1) return TRUE;
    return *bools && all_true(bools+1, len-1);
}

Esta función se puede reescribir en un estilo más recursivo de la cola de la siguiente manera:

int all_true(int* bools, int len) {
    if (len < 1) return TRUE;
    if (!*bools) return FALSE;
    return all_true(bools+1, len-1);
}

Lógicamente, hay una diferencia cero entre los dos; asumiendobools contiene soloTRUE oFALSE (definidas de manera sensata), hacen exactamente lo mismo.

Mi pregunta es: si un compilador es lo suficientemente inteligente como para optimizar el segundo como una llamada recursiva de cola, ¿es razonable esperar que optimice el primero de la misma manera, dado que los cortocircuitos "&&"? Obviamente, si se utilizara un operador sin cortocircuito, esto serían sea recursivo en la cola porque ambas expresiones se evaluarían incluso antes de que se aplique el operador, pero tengo curiosidad sobre el caso de cortocircuito.

(Antes de recibir una avalancha de comentarios que me dicen que los compiladores de C no suelen optimizar las llamadas recursivas de cola: considere que esta es una pregunta general sobre la optimización de las llamadas recursivas de cola con operadores de cortocircuito, independientemente del lenguaje. siéntete feliz de volver a escribir esto en Scheme, Haskell, OCaml, F #, Python, o qué diablos más si no entiendes C.)

Respuestas a la pregunta(2)

Su respuesta a la pregunta