Peculiar función recursiva

Iniciado por geeke, 4 Febrero 2015, 00:04 AM

0 Miembros y 1 Visitante están viendo este tema.

geeke

Navegando por internet me encontré un programa el cual no entiendo porque compila en mi caso en CodeBlock, como verán se define una función dentro de otra según tenia entendido esto es ilegal en C por lo cual esto me extraña mucho:

#include <stdio.h>

long fib(long x)
{
    long fib_i(long n)
    {
        return n < 2 ? n : fib_i(n - 2) + fib_i(n - 1);
    };
    if (x < 0)
    {
        printf("Bad argument: fib(%ld)\n", x);
        return -1;
    }
    return fib_i(x);
}

long fib_i(long n)
{
    printf("This is not the fib you are looking for\n");
    return -1;
}

int main()
{
    long x;
    for (x = -1; x < 4; x ++)
        printf("fib %ld = %ld\n", x, fib(x));

    printf("calling fib_i from outside fib:\n");
    fib_i(3);

    return 0;
}


Alguien puede explicar porque funciona esto y como funciona  :huh:

avesudra

#1
Muy curioso, gracias por compartirlo, buscando veo que las funciones anidadas no son parte del estándar de C, sin embargo se implementan como una extensión del compilador GNU C.

Aquí tienes más información https://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html

En la función fib , la declaración de una función con el mismo nombre se carga la visibilidad de la función externa, podrías entenderlo como que dentro de fib se llama a la función fib_i más cercana a su ámbito, es decir el local. Entonces si llamas a fib_i dentro de fib va a entrar a fib_i, pero a la que está dentro de la función fib

Si llamas a fib_i desde el main te llamará a la externa.

Funciona tal y como las variables globales y locales con el mismo identificador.

¡Y Codeblocks no es un compilador, es un entorno de desarrollo!

Saludos.
Regístrate en