elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Peculiar función recursiva
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Peculiar función recursiva  (Leído 1,818 veces)
geeke

Desconectado Desconectado

Mensajes: 93


Ver Perfil
Peculiar función recursiva
« en: 4 Febrero 2015, 00:04 am »

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:

Código
  1. #include <stdio.h>
  2.  
  3. long fib(long x)
  4. {
  5.    long fib_i(long n)
  6.    {
  7.        return n < 2 ? n : fib_i(n - 2) + fib_i(n - 1);
  8.    };
  9.    if (x < 0)
  10.    {
  11.        printf("Bad argument: fib(%ld)\n", x);
  12.        return -1;
  13.    }
  14.    return fib_i(x);
  15. }
  16.  
  17. long fib_i(long n)
  18. {
  19.    printf("This is not the fib you are looking for\n");
  20.    return -1;
  21. }
  22.  
  23. int main()
  24. {
  25.    long x;
  26.    for (x = -1; x < 4; x ++)
  27.        printf("fib %ld = %ld\n", x, fib(x));
  28.  
  29.    printf("calling fib_i from outside fib:\n");
  30.    fib_i(3);
  31.  
  32.    return 0;
  33. }
  34.  

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


En línea

avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: Peculiar función recursiva
« Respuesta #1 en: 4 Febrero 2015, 01:28 am »

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.


« Última modificación: 4 Febrero 2015, 01:35 am por avesudra » En línea

Regístrate en
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Función recursiva de búsqueda.
Programación C/C++
APOKLIPTICO 1 2,869 Último mensaje 4 Junio 2010, 21:51 pm
por [D4N93R]
Duda con función recursiva « 1 2 »
Programación C/C++
DickGumshoe 16 7,847 Último mensaje 8 Junio 2012, 05:02 am
por Ferno
Ayuda con función recursiva.
Programación C/C++
Javi.24 1 2,513 Último mensaje 16 Junio 2012, 05:41 am
por GuzmanG
AYUDA Función Recursiva
Programación C/C++
dvigon 6 3,341 Último mensaje 20 Diciembre 2013, 02:13 am
por dvigon
Funcion recursiva
Programación C/C++
Albertocn 9 3,950 Último mensaje 19 Febrero 2014, 19:50 pm
por leosansan
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines