Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Mis primeros pasos en C. ¿Papa?

Iniciado por J_F_NASH, 20 de Marzo de 2003, 03:25:49 PM

« anterior - próximo »

J_F_NASH

                                Dios, que agonia!. Tengo un problema:

Determina los valores de cada variable despues que se haya ejecutado el cálculo. Suponga que cuando empieza cada enunciado, todas las variables tienen el valor de 5.

result = ++x + x;

Pues resulta que el resultado es:
result = 12
x = 6

ME LO EXPLIQUEN

Segun mis calculos y empezando de derecha a izquierda a mi me da lo que sigue:

result = 11 (o sea lo que obtengo de x)
x = 11 (sumo las dos x teniendo encuenta que ++x es 5+1)

LLEVO DOS DIAS DANDOLE VUELTAS Y NO LO ENTIENDO. Explicadme con detalle por qué esto es así.


S2.                                

jpastor

                                Como el operado ++ esta delante de x, es lo primero que se hace. Osea que si x=5, tras ++x (x=x+1) tenemos x=6

Luego se hace result = x+x; osea que 6 +6 = 12                                

J_F_NASH

                                Empiezo a entender.
Pero no me queda claro lo de tener el ++ delante o tras la variable.
Por ejemplo:

result = ++x;

Deduzco que:
x=6
result=6

Por contra si el enunciado es:

result = x++;

x sigue siendo 6 (hasta aqui lo entiendo)
result=5 (¿por qué no vale 6 si x++ es lo primero que calculó?)


S2.                                

Mars Attacks

                                He ahí la diferencia entre pre-incremento y post-incremento. Cuando utilizas el preincremento (++x) el cambio a la variable x se realizará ANTES de efectuar ninguna otra operación. Cuando usas el postincremento (x++) el cambio a la variable x se realizará AL FINALIZAR la instrucción en curso.                                

ethernet

Eso es parcialmente cierto, cada compilador es libre de implementar eso como quiera el standard lo dice asi, vamos, no dice nada al respecto xD.

saludos

J_F_NASH

                                Ahora tengo:
z = 2
y = 15

Calcula (z) e (y) en:
y += z++ * z++

Solo puedo entender que:
z = 4
Pero cuando voy a por (y) sencillamente... no se hacerlo. Se supone que me tiene que dar 19, pero ¿podeis explicarme como he de deducirlo?

¿Dónde está mi fallo?
Para calcular (y) lo que yo hago es lo siguiente:
-Lo pongo de forma mas "entendible" para mi, o sea:
y = y + (z++ * z++)
Primero multiplico 2*2 y el resultado se lo sumo al 2 obtenido de los (++) (++). De manera que resulta 6. El paso que me queda entonces es:
y = 15 + 6
Dandome como resultado ¡¡un 21 como una catedral!!

¿¿¡¡ QUÉ COÑO ESTOY HACIENDO MAL !!??

Si no le sumo los (++) me quedo con un 15 + 4 = 19!!!!!!
Pero... ¿por qué no habría de sumarlos? ¿¿no habeis cmentado que en este caso, por estar "detras" de la variable he de hacerlo pero al final de la operación??

(NO CUNDA EL PÁNICO)

S2.                                

rrc2soft

                                Haciendo una traza:
(y=15, z=2)
(Instruccion y += z++ * z++)
1º z++ * z++ (* tiene prioridad sobre +=)
   resultado 4 (2*2)
2º y += 4
   resultado 19 (15+4)
3º z++ (al haberse finalizado la operacion GLOBAL)
   resultado 4

OJO que no soy un guru del C, y que posiblemente me haya explicado mal o la haya pifiado en algo. Gente, corregid  :ojo:                                

Mars Attacks

                                J_F_NASH, relájate un poco :) En mi explicación te he comentado que el postincremento sólo tiene lugar una vez acabada la instrucción (no sólo la operación, sino toda la orden hasta llegar al final de su evaluación). La traza ya te la ha puesto rrc2soft.
A ver si esta pequeña "regla" te aclara las cosas: el preincremento tiene preferencia sobre todas las demás órdenes; se calcula el nuevo valor y se utiliza para todos los cálculos. El postincremento no afecta a la variable hasta que se ha finalizado la instrucción en la que se evaluaba: es decir, usas la z tal y como está y, al acabar de usarla en la instrucción (no sólo en la operación), la incrementas. Tómate un postincremento como un "acuérdate que al acabar de hacer todo lo que tienes que hacer has de incrementar la variable" y punto.                                

MaSteR

                                jejeje q gambazo xD relajarseeee                                

J_F_NASH

                                Vale, AHORA lo entiendo.



S2.                                

J_F_NASH

                                Mas dudas:

¿Cual es la diferencia entre (while) y (for)?
Los veo bien parecidos, salvo que con (for) haces lo mismo pero con menos lineas. ¿Es esa la diferencia?

S2.                                

Mars Attacks

                                Son dos estructuras de control distintas. En un for, pasas obligatoriamente por todo el rango de valores que le asignes a una variable. Esto suele ser muy útil cuando sabes de antemano el número de veces que quieras que se ejecute el bucle (por ejemplo, para recorrer una matriz que sabes que es de 3x3). Pero ¿y si no sabes ese número a priori? Es entonces cuando necesitas la estructura while. De hecho, hasta mediados del siglo pasado se pensaba que con un bucle for se podía hacer cualquier algoritmo. En base a los avances que en la materia efectuaron gente como Turing, se dieron cuenta que había algoritmos para los que el bucle for no era suficiente (creo que la función de Ackerman es uno de esos algoritmos).
Con un bucle while sí se puede utilizar para todos los algoritmos.

Por cierto, estoy hablando de bucles "estándar", nada de hacerle guarradas a la variable del for ni cosas así. ¿Todo claro?

En resumen, con for le dices "me vas a hacer esto este número de veces"; con while le dices "mientras se cumpla esta condición, me has a hacer esto".                                

MaSteR

                                Hombreeeeeeeeeeeeee for para cosas sencillas el control q llevas con un Do While vamos... :D no es =. Mars te lo ha comentao :P                                

Mars Attacks

                                Un poco de historia no hace daño a nadie. Tal vez esto no tendría que estar aquí, pero creo que en algún punto habla del tema de que no se necesita (al menos de momento) ninguna estructura de control más potente que el while. Hoy he mantenido una breve charla con el FM donde me decía "pero yo puedo hacer for(;contador==100;) y eso es igual de potente con un while". Pues a eso me refería con que hablo de for's estándar, sin hacerle guarrerías. Internamente, lo de antes se traduciría como un while(contador==100). Cuando no había whiles había que buscarse la vida de otra forma (en este ejemplo podría ser muy simple, pero hay casos en los que no es nada simple).
Aquí dejo el link sin más dilación:

http://www3.uji.es/~martine/DOC/E45/historia.pdf

Edito: por cierto, que forma parte del temario de mi asignatura de Teoría de Autómatas y Lenguajes Formales, así que podéis fiaros ;) espero no estar infringiendo ninguna ley extraña por poner esto aquí XD si no, ya hablaré con Gloria, la amenazo con un recital de trompeta y fijo que se olvida del asunto XD                                

lord_taran

                                Que bonita es TALF... esos 9 creditazos cuatrimestrales... (al menos en la UCO) que bonitos son lex y yac...                                
n saludo!
Lord Taran
Las Noyas de Taran






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.