[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