Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Dificultad con explicación de sentencia for

Estas en el tema de Dificultad con explicación de sentencia for en el foro de C/C++ en Foros del Web. Hola estimadísimos, estoy leyendo un libro y hay una parte que no entiendo que quizás ustedes tengan mas luces que yo. Les transcribo el contexto ...
  #1 (permalink)  
Antiguo 06/05/2014, 21:24
 
Fecha de Ingreso: octubre-2008
Mensajes: 66
Antigüedad: 15 años, 5 meses
Puntos: 1
Dificultad con explicación de sentencia for

Hola estimadísimos,
estoy leyendo un libro y hay una parte que no entiendo que quizás ustedes tengan mas luces que yo. Les transcribo el contexto y pongo en negrita subrayado la parte que no entiendo:

"El encabezado de "for" contiene tres partes, la primera inicializa la variable de control de ciclo, la segunda es la condición de continuación de ciclo y la tercera incrementa la variable de control.
Con frecuencia, la primera y la tercera parte son listas de expresiones separadas por comas. Las comas, como las usamos aquí, son en realidad operadores coma que garantizan que esas listas de expresiones se evalúen de izquierda a derecha. El valor y el tipo de una lista de expresiones separadas por comas es el valor y el tipo de la expresión que se encuentra más a la derecha de la lista. El operador coma se utiliza con mucha frecuencia en instrucciones for. Su principal aplicación es la de permitir al programador que utilice múltiples expresiones de inicialización y/o múltiples expresiones de incremento."

Desde ya muchas gracias!
  #2 (permalink)  
Antiguo 07/05/2014, 04:29
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Dificultad con explicación de sentencia for

Pues eso, puedes usar literalmente lo que dice.

El caso mas simple y mas habitual:

Código C:
Ver original
  1. int q, w;

Esta instruccion es una declaracion de tipo int bajo las variables nombradas. Ahora el operador coma usado en un bucle for:

Código C:
Ver original
  1. int q, w;
  2.  
  3. w = 10;
  4. for(q = 0; q < 10; q++, w++) {
  5.     printf("%d,%d\n", q, w);
  6. }
  7. printf("\nAl final q=%d, w=%d", q, w);

En este caso el operador coma separa dos incrementos; puedes jugar con esa linea para ver como responde:
Código C:
Ver original
  1. for(q = 0; q < 10; q++, w--) { ... }
  2. for(q = 0; q < 10; q++, (w+=q)) { ... }
  3. for(q = 0; q < 10; (w+=q), q++) { ... }
  4. etc...

Saludos
vosk
  #3 (permalink)  
Antiguo 07/05/2014, 04:30
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Dificultad con explicación de sentencia for

bueno po me liao jaja

no tiene un ejemplo en ese libro?
Lo que dice vosk es lo mas cuadra.

Que lo que hay a la izquierda de la expresión es lo que:

w+=q

El valor de w es = el valor de q, puesto que w+=q es lo mismo que w= w + q, pues w que esta a la izquierda es lo mismo que w+q que esta a la derecha.
Nada que no ayas visto antes XDD.

Ademas de poder hacer lo que dijo vosk que es lo de separarlas por coma q++, w--...
Si no me equivoco vamos jaja

Última edición por vangodp; 07/05/2014 a las 04:51
  #4 (permalink)  
Antiguo 07/05/2014, 06:37
Avatar de iblancasa  
Fecha de Ingreso: diciembre-2012
Ubicación: España
Mensajes: 143
Antigüedad: 11 años, 4 meses
Puntos: 16
Respuesta: Dificultad con explicación de sentencia for

Realmente está explicado un poco regular.

A parte de lo que te han explicado los compañeros, te recomiendo que cojas algún buscador (u otro libro) y veas otras explicaciones para entenderlo mejor.

Un saludo.
  #5 (permalink)  
Antiguo 07/05/2014, 07:04
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Dificultad con explicación de sentencia for

@iblancasa "...está explicado un poco regular..."

@Virtualforos "...Las comas, como las usamos aquí, son en realidad operadores coma que garantizan que esas listas de expresiones se evalúen de izquierda a derecha..."

Es cuestion de leer la descripcion, no veo que este mal explicado. Listas de expresiones separadas por comas que se evaluan de izquierda a derecha:

Código C:
Ver original
  1. int a, b;//dos expresiones de declaracion de tipo int asignadas a las variables
  2.  
  3. for(
  4.     a = 1, b = a, a = 1000;//tres expresiones de asignacion, evaluadas de izquierda a derecha
  5.     a > 900;//una expresion de control del ciclo
  6.     a-=b//una expresion de decrimento
  7.     ) { ... }

Hay mil ejemplos, como le comente mas arriba es cuestion de jugar un poco hasta ver como funciona y como responde.

Saludos
vosk
  #6 (permalink)  
Antiguo 07/05/2014, 07:34
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Dificultad con explicación de sentencia for

nada mejor que un source para reforzar lo que dice vosk XDD
Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. void A1(){
  4.     printf("A1 ");
  5. }
  6. void A2(){
  7.     printf("A2 ");
  8. }
  9. void A3(){
  10.     printf("A3 ");
  11. }
  12. void A4(){
  13.     printf(" A4 ");
  14. }
  15. void A5(){
  16.     printf("A5 ");
  17. }
  18. void A6(){
  19.     printf("A6 \n");
  20. }
  21.  
  22. int main (){
  23.     int i = 0;
  24.  
  25.     for ( i, A1(), A2(), A3(); i<20 ; i++,A4(), A5(), A6() ){
  26.         printf("%d",i);
  27.     }
  28.  
  29.     return 0;
  30. }
Idea de mi gran compañero amchacon XD

salida:
Código C:
Ver original
  1. A1 A2 A3 0 A4 A5 A6
  2. 1 A4 A5 A6
  3. 2 A4 A5 A6
  4. 3 A4 A5 A6
  5. 4 A4 A5 A6
  6. 5 A4 A5 A6
  7. 6 A4 A5 A6
  8. 7 A4 A5 A6
  9. 8 A4 A5 A6
  10. 9 A4 A5 A6
  11. 10 A4 A5 A6
  12. 11 A4 A5 A6
  13. 12 A4 A5 A6
  14. 13 A4 A5 A6
  15. 14 A4 A5 A6
  16. 15 A4 A5 A6
  17. 16 A4 A5 A6
  18. 17 A4 A5 A6
  19. 18 A4 A5 A6
  20. 19 A4 A5 A6
  21.  
  22. Process returned 0 (0x0)   execution time : 0.098 s
  23. Press any key to continue.
  #7 (permalink)  
Antiguo 07/05/2014, 22:08
Principe_Azul
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Dificultad con explicación de sentencia for

Lo que yo entiendo que a la derecha, luego ingresar los 3 parámetros del ciclo for, se pueden opcionalmente agregar más datos, esto sería para utilizar el mismo bucle del for, en vez de crearlo en las instrucciones del bucle for.
Sería algo como "aprovechar" el bucle for para hacer ciertos cálculos, ya que for siempre trabaja con números (incrementando y/o decrementando).

Comparto la idea de vangodp, siempre es mejor ver los resultados haciendo las pruebas y como dice vosk, viendo el comportamiento que va teniendo el programa cuando se realizan cambios.

  #8 (permalink)  
Antiguo 07/05/2014, 22:30
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Dificultad con explicación de sentencia for

La verdad no había probado lo de las comas, parece interesante :D
Aun que no le veo tanta utilidad es una herramienta mas, o la usas o la dejas pero es bueno conocer esas cosillas :D
  #9 (permalink)  
Antiguo 08/05/2014, 12:27
 
Fecha de Ingreso: octubre-2008
Mensajes: 66
Antigüedad: 15 años, 5 meses
Puntos: 1
Respuesta: Dificultad con explicación de sentencia for

Creo que por un lado me están explicando que se puede declarar el tipo de ciertas variables separadas con coma así:
Código:
int a, b, c, d;
Pero a la luz de los días ahora lo que alcanzo a entender de la parte en negrita subrayada
"El valor y el tipo de una lista de expresiones separadas por comas es el valor y el tipo de la expresión que se encuentra más a la derecha de la lista."
es que si por ejemplo si en la tercera parte, en la que se incrementa la variable de control, coloco algunas variables a incrementarse así:

Código:
for(parte1;parte2; variable1++, variable2++){...}
variable1++ tomará el valor y tipo de variable2++ porque esta más a la derecha en la lista.
Esto me parece un poco raro, pero acudo a su consejo para ver que opinan. Desde ya muchas gracias.
  #10 (permalink)  
Antiguo 08/05/2014, 12:35
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Dificultad con explicación de sentencia for

"...variable1++ tomara el valor y tipo de variable2++ porque esta más a la derecha en la lista...."

No, cada expresion separada por comas se evalua de forma aislada, y las expresiones se evaluan de izquierda a derecha, pero las asignaciones no se hacen por si solas, y menos el cambio de tipo.

Código C:
Ver original
  1. int q, w;
  2. float f;
  3.  
  4. for(q = 0, w = 1000, f = 1.5; q < 10; q++, w++, (f += 0.1f)) {
  5.     printf("q=%d\tw=%d\t%.2f\n", q, w, f);
  6. }

Saludos
vosk
  #11 (permalink)  
Antiguo 08/05/2014, 13:30
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Dificultad con explicación de sentencia for

Si fuera así solo bastaría imprimirlas como dijo vosk y obtendrías el resultado proyectado.
Ya hemos demostrado tanto el orden como el resultado.
Algunos libros son muy lioso. Lo que has aprendido aquí lo respalda muchos programadores y todos dicen lo mismo, créame se lo he preguntado y investigado algo ;)
Tienes demostrado el orden y los valores y eso no va a cambiar, puedes hacer pruebas si quieres pero te vas hartar XDDD
Usa la lógica... ¿Que sentido tiene eso? Separar para tomar el valor? Es casi como un sacrilegio jaja
Recomiendo tirar el libro a la papelera si sigue enseñándote de esta forma jaja. Es Broma he :D

Pero ahora te voy a desmontar la teoría con tus mismas dudas.XDDD
¿Que sentido tiene esto?

char variable1 = 'a';
float variable2 = 89.75;

for( int i = 0; i < 0; i++, variable1, variable2 )

¿Que le va pasar con el i++ si toma el valor de la derecha como dices??????? wtf!!!

Lo estropearías el indice del bucle si así fuera. ¿Funcionaria de forma anómala no crees? XDD

Código C++:
Ver original
  1. #include <iostream>
  2. #include <windows.h>
  3.  
  4. using namespace std;
  5.  
  6. int main (){
  7.     system("MODE CON cols=100 lines=50");
  8.    
  9.     float variable2 = 10.89;
  10.     int variable1 = 20;  
  11.    
  12.     for( int i = 0; i<10; i++, variable1++, variable2++ ){
  13.         cout << "indice:" << i <<" variable1:" << float (variable1) << "  variable2:" << variable2 << endl;
  14.     }
  15.    
  16.     cin.ignore();
  17.     return 0;
  18. }

fíate que imprimo variable1 como un float para ver si pilla el tipo de la variable2 que es un float y variable1 es int.No pilla ni el valor ni el tipo, así que salta el capitulo ese y si el libro te plantea mas dudas de la que resuelve tíralo. XDDD
¡Eso que tienes dudas no va pasar por que si el indice estuviera a la izquierda y tomara el valor de algo que estuviera a la derecha perderías el control sobre el bucle. ¡Y punto!
Ahora por infiel a rezar 10 whiles nuestros y 20 structs santificados amen ;)

indice:0 variable1:20 variable2:10.89
indice:1 variable1:21 variable2:11.89
indice:2 variable1:22 variable2:12.89
indice:3 variable1:23 variable2:13.89
indice:4 variable1:24 variable2:14.89
indice:5 variable1:25 variable2:15.89
indice:6 variable1:26 variable2:16.89
indice:7 variable1:27 variable2:17.89
indice:8 variable1:28 variable2:18.89
indice:9 variable1:29 variable2:19.89
  #12 (permalink)  
Antiguo 08/05/2014, 16:18
 
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

Las implicancias de lo indicado por @virtualforos son mas evidentes en otros contextos.
Lo que hay que entender de la frase es:
- existen las expresiones formadas por varias expresiones
- esas expresiones compuestas TIENEN TIPO y TIENEN VALOR
- el valor de una expresion formada por varias expresiones es el valor de la ultima. El tipo es el tipo de la ultima.

Ahora, ejercite esto y adivine que imprime este programa:

Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.    int i = 1, j =2, k = 3;
  6.  
  7.    i = (j = 4, k = 5);
  8.  
  9.    printf( "%d %d %d\n", i, j, k );
  10.  
  11.    return 0;
  12.  
  13. }

Adivinó? Compruebe sus conjeturas al ver el programa ejecutandose aqui: http://goo.gl/hCOSlO
__________________
Visita mi perfil en LinkedIn
  #13 (permalink)  
Antiguo 08/05/2014, 18:57
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Dificultad con explicación de sentencia for

Aun así hay lagunas mentales en este texto XDD
"El valor y el tipo de una lista de expresiones separadas por comas es el valor y el tipo de la expresión que se encuentra más a la derecha de la lista."
i = (j = 4, k = 5);

Si k fuera un float, a i no le iba entrar lo que hay después del punto
o sea que si k = 9.87, i solo iba a guardar el 9 perdiendo así el .87. Lo que nos lleva a dudar de la frase tan liosa que es.
O sea que el "...es el valor y el tipo de la expresión que se encuentra más a la derecha de la lista"

Puede que el valor si pero el tipo no estoy de acuerdo, siempre sera un entero, por que si i es entero nada le va cambiar su tipo a menos que le hagas un cast.

Esto: i = (j = 4, k = 5);
Es igual a esto: i = k = 5;

En ese texto tiene gato encerrado XDDD
Quizás debas subir todo el capitulo o decirnos a que libro pertenece el texto y así ver si lo llegamos a algo. Yo creo que la pregunta esta contestada aun que hay gente con mas luces que yo que puede esclarecer eso mejor.
Pero es algo mas al aporte, bien señalado ;)

Aquí os dejo ejecutándose también.
http://codepad.org/O4xI5tbA
Suerte! Y a ver si alguien lo ve algo mas que poco a poco llegaremos a una solución XDD
  #14 (permalink)  
Antiguo 08/05/2014, 20:31
 
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

En C es completamente posible hacer int i = 3.5;
pero claro, no se guarda 3.5, se guarda 3 (o 4, tal vez), no el nro decimal original.
De que tipo es el valor 3.5 que está a la derecha? (R:float o double)
De que tipo es i? (R:entero)
El valor AL asignarse hacia i es convertido en entero, pero esto no quita que 3.5 es un float (o double), ni convierte i a un float.

Dado esto, el ejemplo que se da con k float e i entero NO INVALIDA la regla del TIPO y valor enunciada.
__________________
Visita mi perfil en LinkedIn
  #15 (permalink)  
Antiguo 09/05/2014, 04:09
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Dificultad con explicación de sentencia for

en c++ si se puede ^^
  #16 (permalink)  
Antiguo 09/05/2014, 04:15
 
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

No se a que te refieres.
Mostrarias un ejemplo de lo que quieres decir?
__________________
Visita mi perfil en LinkedIn
  #17 (permalink)  
Antiguo 09/05/2014, 04:27
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Dificultad con explicación de sentencia for

Con la variable auto =)
Código C++:
Ver original
  1. #include <cstdio>
  2.  
  3. int main()
  4. {
  5.    int j =2;
  6.    float k = 3.0;
  7.  
  8.    auto i = (j = 4, k = 9.87);
  9.  
  10.    printf( "%d %d %f\n", i, j, k );
  11.    printf( "Imprimimos i como float: %f\nComo puedes ver es un error imprimir i como float por que no lo es, es un int.", i );
  12.    return 0;
  13. }

Es del estándar c++11. Solo sirve a la hora de asignar, por que toma el valor y el tipo de lo que le asignas ;)
Es el mismo programa de antes pero con la i tipo auto XD
  #18 (permalink)  
Antiguo 09/05/2014, 06:13
 
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

No es ejemplo de un cambio de tipo.
Se le asocia un tipo, pero no se está cambiando ninguno y, nuevamente, no invalida la regla que el tipo de la expresión de la derecha, aquella con varias expresiones separadas con coma, es el tipo de la última expresión.

Si volvemos al tópico central, creo que estarás de acuerdo con que la regla se cumple.
__________________
Visita mi perfil en LinkedIn
  #19 (permalink)  
Antiguo 09/05/2014, 07:35
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Dificultad con explicación de sentencia for

Cita:
..aquella con varias expresiones separadas con coma, es el tipo de la última expresión.
Pues no, no estoy de acuerdo! ¿Que quieres que te diga? La i no cambia de tipo sigue siendo el mismo tipo que cuando la creaste(un int).
Si me explicas mejor quizás puede que aya algo que no entienda en lo que dices, pero realmente no hay ningún cambio de tipo en la sentencia i = (j = 4, k = 5); todos son int.

En eso que dices:- "el valor de una expresion formada por varias expresiones es el valor de la ultima. El tipo es el tipo de la ultima."

Puede que el tipo que pase sea el tipo de valor de la ultima pero eso no hace que la primera le cambie su tipo.
Aun que k sea un float y pase un float i lo que espera es un int y lo va "recortar" el float dejando lo que esta después del punto.
i= (j = 4, k = 5);
No he dicho que se invalida nada, lo que quiero decir es que no se puede cambiar un tipo o al menos eso es lo que creo(sin hacer un cast claro esta).
Si sabes alguna forma de hacer una variable cambiar de tipo soy todo oídos XDD

Última edición por vangodp; 09/05/2014 a las 07:53
  #20 (permalink)  
Antiguo 09/05/2014, 08:06
 
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
  #21 (permalink)  
Antiguo 09/05/2014, 09:00
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Dificultad con explicación de sentencia for

Lo que estas hablando que de el valor de la derecha se convierte de float a int no he dicho ni mu y no le veo problema ninguno en lo que dices.
El problema me parece que quien no ves ere tu. :)
El valor y el tipo de una lista de expresiones separadas por comas es el valor y el tipo de la expresión que se encuentra más a la derecha de la lista.

lo que esta diciendo aquí claramente... no se a donde estas dando vueltas para llegar pero el texto es claro, y que dice que el valor y el tipo de la izquierda es el valor y tipo de la derecha. ¡No es asi! El valor de la izquierda siempre es int(si así lo declaramos), por mas casts que te haga el compilador automáticamente el valor de la izquierda no va cambiar por que el de la derecha sea float ni ningún otro. Lo que me dices es que el que cambia es el de la derecha y eso ya te dije que si se puede haciendo cast¿Si o no?
Es como hacer esto:

int i = 1, j =2;
float temp;
float k;

temp = (j = 4, k = 5.87);

i = (float) (temp);

No se que conversión realmente has echo en en el tipo int de la i...sigue siendo int :S

No aclaras nada :S
Solo consigues liarme mas XDDD


////////////////////////////////////////////////////
El valor y el tipo de una lista de expresiones separadas por comas es el valor y el tipo de la expresión que se encuentra más a la derecha de la lista

analicemos cada punto de lo que dice eso XDD


El valor y tipo...
int num = 100, int es el tipo y valor es el 100...ningún misterio.

... de una lista de expresiones separados por comas....
Una lista de expresiones es lo que comentas: j=5, k=3, m=89..... ¿correcto?
No sabemos los tipos por que no los pongo pero si se debe saber en todo el momento si no lo subiera que clase de programador seria yo(Y soy malo XDD)?

...es el valor y el tipo de la expresión que se encuentra más a la derecha de la lista...

j=5, k=3, m=89

o sea que en la lista es el valor y tipo de m=89.

No puede ser...

si hago
int n;

n = (j=5, k=3, m=89);

da igual lo que hagas n no es el tipo de m sea cual sea. :S

jaja me tengo un lio mental del copón hoy XDD

A ver que dices sobre eso por que aun no lo pillo :/
  #22 (permalink)  
Antiguo 09/05/2014, 09:17
 
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

Olvida la asignación, pues si la consideras, confundes la regla.

Cuando dices la regla, pareciera que ella incluyera la asignacion, pero no es asi
"El valor y el tipo de una lista de expresiones separadas por comas es el valor y el tipo de la expresión que se encuentra más a la derecha de la lista."

Solo debes considerar "una lista de expresiones separadas por comas" para aplicar la regla

Si asignas

i = lista de expresiones separadas por comas

y aplicas la regla a "i", estas aplicando mal la regla, pues la asignación NO ES PARTE de la lista de expresiones separadas por comas.

Si fuera parte te encontraría la razón, pero NO es parte.

En la regla
"El valor y el tipo de una lista de expresiones separadas por comas es el valor y el tipo de la expresión que se encuentra más a la derecha de la lista."
( j = 3, k = 4 ) seria un ejemplo de una lista de expresiones separadas ṕor comas

i = ( j = 3, k = 4 ) NO es una lista de expresiones separadas por comas, pero SI ES una instruccion que CONTIENE una.
Adonde se aplica la regla? solo al lado derecho de la asignacion.

Que valor se asigna a i? Pues el valor de la expresion de la derecha
Que valor es ese? el valor de la ultima expresion
Que tipo tiene el valor de esa expresion? el tipo de la ultima expresion

Si consideras a la asignacion parte de la regla, la aplicas mal.
__________________
Visita mi perfil en LinkedIn
  #23 (permalink)  
Antiguo 09/05/2014, 11:15
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Dificultad con explicación de sentencia for

vale vala ya te entiendo jeje

Código C++:
Ver original
  1. #include <iostream>
  2. #include <cstdio>
  3. using namespace std;
  4.  
  5. int main () {
  6.  
  7.    
  8.     float i[3] = { 10, 'a'+0.32, 3.14 }; //float i es donde guardaremos la lista
  9.    
  10.     //El 3.14 es el que hace que toda la lista sea float
  11.    
  12.     printf("%f\n",i[0]);  
  13.     printf("%f\n",i[1]);
  14.     printf("%f\n",i[2]);  
  15.     return 0;
  16. }

perfecto ;)
Te entiendo ;) "la lista toda es el tipo del ultimo valor que es 3.14 o sea un float"

...que le guarde en un float es otra cosa ;)

pero eso no quita que el texto ese...
Cita:
El valor y el tipo de una lista de expresiones separadas por comas es el valor y el tipo de la expresión que se encuentra más a la derecha de la lista.
...sea muy lioso

suerte y gracias por la paciencia
  #24 (permalink)  
Antiguo 10/05/2014, 12:01
 
Fecha de Ingreso: octubre-2008
Mensajes: 66
Antigüedad: 15 años, 5 meses
Puntos: 1
Respuesta: Dificultad con explicación de sentencia for

Hay muchas cosas que utilizan en sus ejemplos que todavía no aprendí pero creo que llegan a la conclusión de que
"El valor y el tipo de una lista de expresiones separadas por comas es el valor y el tipo de la expresión que se encuentra más a la derecha de la lista."
Espero que se cumpla en todas las circunstancias porque pienso aplicarlo frecuentemente.
De paso les comento que el libro es "Como programar en C, C++ y java" por Deitel.
Les agradezco enormemente por su tiempo y amabalidad!!! Que bueno que esten en el foro : )
  #25 (permalink)  
Antiguo 10/05/2014, 12:41
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Dificultad con explicación de sentencia for

Si has entendido bien lo que se ha dicho aquí bien, si tienes dudas sigue preguntando ;)
  #26 (permalink)  
Antiguo 10/05/2014, 12:44
 
Fecha de Ingreso: octubre-2008
Mensajes: 66
Antigüedad: 15 años, 5 meses
Puntos: 1
Respuesta: Dificultad con explicación de sentencia for

Copio el ejemplo que me aclaró bastante para que el que lea el utlimo mensaje vea la cuestión claramente:
Cita:
Iniciado por CalgaryCorpus Ver Mensaje
Las implicancias de lo indicado por @virtualforos son mas evidentes en otros contextos.
Lo que hay que entender de la frase es:
- existen las expresiones formadas por varias expresiones
- esas expresiones compuestas TIENEN TIPO y TIENEN VALOR
- el valor de una expresion formada por varias expresiones es el valor de la ultima. El tipo es el tipo de la ultima.

Ahora, ejercite esto y adivine que imprime este programa:

Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.    int i = 1, j =2, k = 3;
  6.  
  7.    i = (j = 4, k = 5);
  8.  
  9.    printf( "%d %d %d\n", i, j, k );
  10.  
  11.    return 0;
  12.  
  13. }

Adivinó? Compruebe sus conjeturas al ver el programa ejecutandose aqui: http://goo.gl/hCOSlO

GRACIAS DE NUEVO!
  #27 (permalink)  
Antiguo 10/05/2014, 12:45
 
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

La regla se cumple siempre.
Es una regla de sintaxis del lenguaje y los compiladores implementan de manera estricta las reglas del mismo.
__________________
Visita mi perfil en LinkedIn

Etiquetas: dificultad, programa, sentencia
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:16.