Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: XorNet en 23 Julio 2013, 00:36 am



Título: Ayuda 1pregunta en C/C++
Publicado por: XorNet en 23 Julio 2013, 00:36 am
Bueno tengo 1 duda que para ustedes quizas sea estúpida xD Bueno aqui va, sí tenemos un programa se la siguiente manera:
Código
  1. #include <stdio.h>
  2.  
  3. int funcion2()
  4. {
  5.    return 5;
  6. }
  7.  
  8. int funcion1()
  9. {
  10.   return funcion2();
  11. /* Mi duda esta acá, es decir, a retornar una función este
  12. entra a esa función y retorna lo mismo
  13. que retorna la funcion2? Osea en este caso la funcion 2 retorna 5, entonces la funcion1()
  14. entra a la función2() y esta retorna lo mismo que la funcion2()?
  15. Ya que como esta  retornando la función yo opino que la funcion1() entra a la funcion2() dado que la funcion2()
  16. retorna 5, la funcion1() retornara 5 ya que esta
  17. pidiendo que retorne a la funcion2()*/
  18. }
  19.  
  20. int main(void)
  21. {
  22.    printf("%d \n",funcion1() );
  23.  
  24.   getchar();
  25.   return 0;
  26. }
  27.  




Título: Re: Ayuda 1pregunta en C/C++
Publicado por: z3nth10n en 23 Julio 2013, 00:58 am
No me he entrao de ná. xD

A ver... Esto es probarlo y aun no me ha quedado claro tu duda...

PD: Tal como tienes en tu code todo esto, te va a salir 5, y tu pides el porque... Yo no tengo npi. xD


Título: Re: Ayuda 1pregunta en C/C++
Publicado por: XorNet en 23 Julio 2013, 01:07 am
No me he entrao de ná. xD

A ver... Esto es probarlo y aun no me ha quedado claro tu duda...

PD: Tal como tienes en tu code todo esto, te va a salir 5, y tu pides el porque... Yo no tengo npi. xD

Lo que trato de decir es que, al retornar una función este entra a la función y retorna el resultado esa función? o retorna la función (Perdóname semejante estupidez seguro no es así pero quiero asegurarme xddd)


Título: Re: Ayuda 1pregunta en C/C++
Publicado por: z3nth10n en 23 Julio 2013, 01:13 am
No tengo una respuesta certera 100%, pero como puedes observar ese return engloba a toda la función por lo que probablemente, estés retornando la función entera , aunque si te das cuenta siempre que uses return al final de una variable, supongo que podrás hacer int algo = 6; y luego un return algo;... Y ya ahí estés retornando una variable, pero yo que te voy a decir si he empezado hoy con C++ xD

Que te digan los pros del sub-foro de Programación C++ lo que ellos pienses.
PD: No se porque quieres saber tal tontería, pero bueno. :huh:


Título: Re: Ayuda 1pregunta en C/C++
Publicado por: Puntoinfinito en 23 Julio 2013, 01:13 am
A ver, lo primero que se ejecuta es main(), evidentemente. Luego a partir de ahí llama a la impresión de pantalla con el valor que retorna function1(), que esta va a function2() que retorna el número 5, y luego vuelve a main(), en este caso ejecuta getchar() y bye bye.


Título: Re: Ayuda 1pregunta en C/C++
Publicado por: Caster en 23 Julio 2013, 10:30 am
Lo primero: Hay que aprender a explicarse un poco mejor, sin animo de ofender.

Segundo: No hay mejor manera de aprender a programar que probando cada uno sus codigos, al compilar este codigo:

Código
  1. #include <stdio.h>
  2.  
  3. int funcion1();
  4. int funcion2();
  5.  
  6. int main()
  7. {
  8. printf("%d", funcion1());
  9. return 0;
  10. }
  11.  
  12. int funcion2()
  13. {
  14. return 5;
  15. }
  16.  
  17. int funcion1()
  18. {
  19. return funcion2();
  20. }
  21.  

el compilador no da ningun aviso ni error y compilar perfectamente, y el resultado es este:

Citar
5

Saludos.


Título: Re: Ayuda 1pregunta en C/C++
Publicado por: calabuig21 en 23 Julio 2013, 10:46 am
Hazte un dibujo a mano, sigue las funciones y verás el resultado. Un ejemplo fácil lo puedes hacer en papel y lapiz  ;D


Título: Re: Ayuda 1pregunta en C/C++
Publicado por: eferion en 23 Julio 2013, 10:56 am
cuando tu haces

Código
  1. #include <stdio.h>
  2.  
  3. int funcion2()
  4. {
  5.    return 5;
  6. }
  7.  
  8. int funcion1()
  9. {
  10.   return funcion2();
  11. }
  12.  
  13. int main(void)
  14. {
  15.    printf("%d \n",funcion1() );
  16.  
  17.   getchar();
  18.   return 0;
  19. }

Lo que estás haciendo, realmente, es lo siguiente:

* Has creado una función "funcion2", que lo único que hace es devolver el resultado que a su vez le proporciona otra funcion "funcion1".

* Dado que funcion1 siempre va a devolver un 5, funcion2 va a devolver ese mismo 5.

* El printf del main va a sacar por pantalla el valor devuelto por funcion2... es decir, un 5.

Cuando tu haces lo siguiente:

Código
  1. int funcion2( )
  2. {
  3.  return funcion1( );
  4. }

No estás devolviendo una función... sino el resultado de esa función.

De hecho, lo que has puesto es equivalente a:

Código
  1. int funcion2( )
  2. {
  3.  int resultado = funcion1( );
  4.  return resultado;
  5. }

Es decir, tu no devuelves funciones. Más bien estás llamando a una función determinada ( funcion1 ) y estás almacenando el resultado que te devuelve.


Título: Re: Ayuda 1pregunta en C/C++
Publicado por: zonahurbana en 24 Julio 2013, 07:01 am
Código
  1. #include <stdio.h>
  2.  
  3. int funcion2()
  4. {
  5.    return 5;
  6. }
  7.  
  8. int funcion1()
  9. {
  10.   return funcion2();
  11. }
  12.  
  13. int main(void)
  14. {
  15.    printf("%d \n",funcion1() );
  16.  
  17.   getchar();
  18.   return 0;
  19. }
  20.  

- Al inicio se encuentra la declaración y definición de ambas funciones (ello no implica que se ejecuten antes de main(), sólo si son llamadas por esta función principal).
- Desde main() muestras el valor devuelto por funcion1().
- funcion1() devuelve el valor devuelto por funcion2().
- funcion2() devuelve 5.
- Se muestra 5 por pantalla.

Extra.
Por lo general se recomienda escribir antes de main() los prototipos de las funciones. Algo como:
Código
  1. int funcion1();
  2. int funcion2();
Y luego, usualmente después de main(), definir el cuerpo de las funciones, para que no haya conflictos en programas donde usas muchas.

Por ejemplo, en tu programa, si el orden hubiese sido el siguiente:
Código
  1. #include <stdio.h>
  2.  
  3. int funcion1()
  4. {
  5.   return funcion2();
  6. }
  7.  
  8. int funcion2()
  9. {
  10.    return 5;
  11. }
  12.  
  13. int main(void)
  14. {
  15.    printf("%d \n",funcion1() );
  16.  
  17.   getchar();
  18.   return 0;
  19. }
... hubiese errores, ya que al momento en que se define el cuerpo de funcion1() aún no existe funcion2(). Entonces cuando muchas funciones se llamen entre sí, para no estar pendientes del orden, es mejor escribir sus declaraciones (prototipos  :silbar:).


Título: Re: Ayuda 1pregunta en C/C++
Publicado por: amchacon en 24 Julio 2013, 07:54 am
Vamos ha hacerlo más interesante. Esto es una función que te calcula las veces que tienes que dividir entre 2 un número para obtener 0:

Código
  1. #include <stdio.h>
  2.  
  3. int funcion1(int i)
  4. {
  5.  if (i == 0) return 0;
  6.  
  7.  return funcion1(i/2) + 1;
  8. }
  9.  
  10. int main(void)
  11. {
  12.   printf("%d iteraciones \n",funcion1(10) );
  13.  
  14.  getchar();
  15.  return 0;
  16. }

Como puedes ver, se puede retornar incluso la misma función.

A esta técnica de programación se le llama recursividad, o función recursiva.


Título: Re: Ayuda 1pregunta en C/C++
Publicado por: Eternal Idol en 24 Julio 2013, 11:01 am
XorNet: la funcion1 LLAMA a la funcion2 y retorna lo que esta retorna.

Un pseudocodigo:
funcion1:
call funcion2
ret

funcion2:
mov eax, 5
ret

amchacon: para no confundir funcion1 retorna siempre un entero aunque se llama a si misma.


Título: Re: Ayuda 1pregunta en C/C++
Publicado por: NoLife en 26 Julio 2013, 01:32 am
bueno, basicamente a lo que haces colocando una funcion dentro de otra, se le llama reuso de una funcion. el por que de ser 5?, porque la sola invocacion de la primera funcion, en este caso es del tipo-returno (int), por tiene que  haber obligatoriamente un returno.

 
Código:
int function2()
{
return function1() + 10;
}
entonces ya el resultado seria 15. :P