[C con Clase] C++, apartado 5 (Sentencias), Salto, De retorno (return), ejemplo 1
Steven Davidson
srd4121 en njit.edu
Jue Jul 5 18:50:38 CEST 2012
Hola Ángel,
On 7/5/2012 11:45 AM, Angel wrote:
> int Paridad(int x)
> {
> if(x % 2) return 1;
> return 0;
> }
>
> No entiendo bien este ejemplo, ya que si la división de el número
> entre 2 es igual a 0, ¿eso no sería igual a la función lógica
Se trata del resto de la división de 'x' entre 2.
> “false”? Entonces no se tendría que evaluar la expresión “return 1”,
> pero en el ejemplo dice que sí se evalúa si el resto da 0, si
> pudieran aclararme esta duda, me harían un gran favor ya que estoy
> aprendiendo C++ y no me gustaría nada perderme al principio.
Lo que se dice en el curso es:
"Si el resto de dividir el parámetro entre 2 es distinto de cero,
implica que el parámetro es impar, y la función retorna con valor 1."
Es decir, que la lógica implica este comportamiento:
x % 2 | retorno
-------+---------
0 | 0
1 | 1
Claro que viendo este comportamiento, podríamos reescribir esta función así:
int Paridad( int x )
{
return x % 2;
}
> Y otra duda más, ¿el valor que se define en return es el valor que
> toma la función que va antes de los corchetes? Me explico:
>
Puedes pensar así, si te es más fácil de entender su uso.
> Ola()
Sería,
int Ola()
> {
> ...
> return 78;
> }
>
> ¿La variable “Ola” tendría valor 78? Es que no he entendido bien la
> función return.
>
Antes de explicar el tema de las funciones, tengo que corregir las
palabras que usas, para que no haya confusión. En tu ejemplo, 'Ola' no
es una variable, sino una función. Las variables son entidades que
sirven para guardar un valor, y a veces un grupo de valores, que verás
más adelante en el curso.
Creo que es más fácil pensar en las funciones en la informática como las
funciones en las matemáticas. Por ejemplo,
Deja que,
f(x) = x^2
¿Qué es f(3)? La solución es simplemente sustituir 'x' por 3 en la
definición de 'f', resultando en el cálculo: 3^2 = 9.
Otro ejemplo algo más complicado es,
Deja que,
f(x) = x^2
g(x) = f(x/2) + 2x
¿Qué es g(6)? La solución implica lo mismo que hicimos antes.
Sustituimos 'x' por 6 en 'g', dando el cálculo:
f(6/2) + 2*6
que da lugar a,
f(3) + 12
Esto implica que tenemos que calcular 'f(3)', que ya sabemos que es 9.
Esto da lugar a,
9 + 12 = 21
Como puedes ver, 'f(3)' es sustituido por su valor calculado en la
expresión de 'g(3)'.
En C/C++, ocurre algo muy parecido al invocar una función. Tenemos que
detener la evaluación de la expresión para determinar ese valor que
retorna o regresa una función, antes de continuar evaluando la expresión
que tenemos entre manos. Por ejemplo,
int func( int a, int b )
{
return (a+b) * (a-b);
}
Si luego en el programa, invocamos esta función así:
int res;
res = 4 * func(2,3) + func(5,1) / 2;
Entonces tenemos que hacer un salto a la definición de 'func()'. En este
"salto", copiamos los valores de la invocación (2 y 3) a los parámetros
locales de 'func()' (a y b, respectivamente) para ejecutar las
sentencias. Sin embargo, SIEMPRE tenemos que volver al punto de
invocación de cualquier función. En este caso, 'func()' no solamente
retorna sino que además envía un valor a usarse en ese punto de
invocación. Este comportamiento es igual al de las funciones en las
matemáticas.
En este ejemplo, haríamos esto:
func(2,3):
int a = 2;
int b = 3;
return -5
y luego,
func(5,1):
int a = 5;
int b = 1;
return 24
Para luego seguir con la evaluación de la expresión:
res = 4 * func(2,3) + func(5,1) / 2;
cuyo comportamiento será ahora,
res = 4 * (-5) + 24 / 2;
que al final será,
res = -8;
Técnicamente, el compilador mantiene una variable especial donde guardar
el valor retornado. Puedes pensar que las sentencias anteriores son:
int __resultado__; // piensa que es global
int func( int a, int b )
{
__resultado__ = (a+b) * (a-b);
return;
}
Si luego en el programa, invocamos esta función así:
int res;
func(2,3);
res = 4 * __resultado__;
func(5,1);
res += __resultado__ / 2;
Espero haber aclarado las dudas.
Steven
Más información sobre la lista de distribución Cconclase