Dudo mucho que para un sólo archivo haya hecho un proyecto. Lo que uno se imagina es eso mismo que tú dices vangodp puesto que en teoría es lo que debería de ocurrir pero no es lo que ocurre ya que al pasar a código máquina el compilador hace magia y se inventa que hay return incluso si no lo hay. Por ejemplo compilo su código con gcc sin tocar absolutamente nada y miro el código máquina que obtengo de la función y saco lo siguiente:
Como puedes ver (dependiendo de lo que estés acostumbrado a leer instrucciones de la máquina) independientemente de lo que se haga en el if se devuelve un valor.
Ahora voy a cambiar la configuración de optimización compilar en gcc -O1. Ahora pruebo a ejecutar el programa y ahora me dice que 2 elevado a 3 es 2, que como todos sabemos no es correcto:
Veamos ahora cual es el código máquina de la función:
Ahora en las llamadas recursivas no almacena finalmente en el dato en el eax, solo almacena el caso base en el mismo, por lo que se que independientemente de lo que ponga siempre me va a devolver la base que ponga. Al compilar así 2 elevado a cualquier cosa siempre valdrá 2, 3 elevado a cualquier cosa siempre valdrá 3 y también queda demostrado que el resultado haciendo este tipo de cosas es impredecible aunque con tantos años de experiencia que llevan los compiladores de C muchas veces atinan por sí sólos aunque nosotros nos equivoquemos.
Ya no voy a hacer más ejemplos pero podéis ir probando con el resto e ir observando los diferentes comportamientos de un código mal escrito.
Saludos.