Ver Mensaje Individual
  #20 (permalink)  
Antiguo 09/05/2014, 08:06
CalgaryCorpus
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Dificultad con explicación de sentencia for

2 ejemplos:

int i = 3;
int j = 3.5;

ambos aceptados por el lenguaje. Ambos asociarán algún valor a esas variables, pero eso no es relevante para la explicación aún (lo veo mas abajo, pero aun no). Veamos el lado derecho de las asignaciones (inicializaciones, realmente)

El tipo del "3" a la derecha de i: int
El tipo del "3.5" a la derecha de j: float (o double)

¿Correcto?

Si crees que el 3.5 que está a la derecha de j es float, entonces seguimos, porque hasta ahora estamos de acuerdo. Si crees que cambia, y el tipo de "3.5" es int porque se le está asignando a j que es de tipo int, ahí está tu error.

Si sigues hasta ahora y estas de acuerdo con que el tipo de 3 es int y el tipo de 3.5 es float, obscurescamos esto que es tan claro (supongo) con estos cambios

int i = expresion1;
int j = expresion2;

de que tipo son expresion1 y expresion2?

si no te muestro expresion1 o expresion2, lo puedes saber?
Si me dices "claro! son int porque los tipos de i y j son int" estas en contraposicion con los ejemplos que mostré mas arriba. El tipo de las expresiones NO son los tipos de las variables a las que se asignan sus valores.

Si has aceptado que las expresiones de la derecha pueden ser int o float sin problemas, no veo por que asocias que el tipo de la expresion a la derecha de una asignacion esta ligado fuertemente por el tipo de la variable a la que se asigna.

Veamos ambos casos iniciales otra vez:

int i = 3;
int j = 3.5;

en el primer caso el compilador al ver int = int (int a ambos lados de la asignacion), generara codigo para hacer la asignacion directamente

en el segundo caso el compilador al ver int = float (int a un lado, float al otro), generara codigo para 2 cosas:
- convertir el float (truncando o redondeando y disminuyendo) hacia un int,
- luego de la conversion tendra int = int y podra hacer la asignacion directa como lo hice en el caso anterior

Esto siempre ha existido, es el cast de valores.

Los tipos nunca cambian. "i" y "j" siguen felices siendo enteros porque lo que haya a la derecha es convertido por el compilador gratis. Ahora, no todas las conversiones de valores están permitidas pero de int a float y viceversa, si.

Finalmente, si retiro el velo que puse sobre "expresion1" y digo que expresion1 es una expresion como esta: ( exp1, exp2, exp3 ), pero no te digo aun que son exp1, exp2 o exp3, ahora sabes mas:
- se ejecutaran exp1, exp2 y exp3 en ese orden,
- el valor de la expresion sera el valor de exp3 y
- el tipo sera el de exp3.

Por que es relevante saber el tipo de exp3? porque el compilador en 1 caso (si es int) no hará conversión alguna, como mencione previamente y en el otro caso (float) el compilador tiene que convertir el valor que resulte hacia el int al lado izquierdo antes de asignar. La pregunta es si el compilador tiene o no que trabajar adicionalmente, por eso es relevante el tipo de la expresion y se requiere esa definicion.
__________________
Visita mi perfil en LinkedIn