[C con Clase] Precedencia de operadores

amauri d b_duhart en live.com.mx
Dom Ene 20 22:38:58 CET 2013


Steven, great!
Gracias ya los pude resolver todos. Como resumen:
1. Evalúo primero de acuerdo con la precedencia de los operadores.
2. Para operadores equitativos, leo la expresión de derecha a izquierda o viceversa, según sea el caso.
3. Si son los operadores ++ o --, determino si es preoperacional o postoperacional, en este caso el valor de la variable se modifica despúes de evaluar la expresión, sin afectar a esta.

B.Amauri.Date: Sat, 19 Jan 2013 21:17:30 -0500
From: srd4121 en njit.edu
To: cconclase en listas.conclase.net
Subject: Re: [C con Clase] Precedencia de operadores

Hola B.Amauri,
2013/1/19 amauri d <b_duhart en live.com.mx>


[CORTE]
 
Ej:
"Dadas las siguientes variables:
int a = 10, b = 100, c = 30, d = 1, e = 54;
int m[10] = {10,20,30,40,50,60,70,80,90,100};
int *p = &m[3], *q = &m[6];
Evaluar, sin usar un compilador, las siguientes expresiones.

Considerar que los resultados de cada una de las expresiones no influyen en las siguientes:
d)  b++ * c-- + *q * m[2] / d;"

Según yo, primero sustituyo *q y m[2] por la precedencia, segundo, realizo las multiplicaciones y 
divisiones, que no están implicadas con ++ ni con -- (con una mayor precedencia que estas), debido a que los separa una suma.


Técnicamente, el primer operador es [], ya que es el que tiene mayor nivel de precedencia en esta expresión. En segundo lugar, van los operadores ++, --, y * que son unitarios. Para "desempatar" estos tres operadores, miramos su asociatividad en la expresión. Leyendo de derecha a izquierda, el orden a seguir es: * (unitario), --, y luego ++. Por último, los operadores binarios: *, *, y / son los de menor nivel de precedencia, y para desempatar, los asociamos de izquierda a derecha en la expresión; seguimos el siguiente orden: * (primero izquierdo), * (segundo), y luego /.


Resumiendo, el orden de evaluación es el siguiente:

1.  []2.  * (unitario)3.  --4.  ++5.  * (binario), el primero a mano izquierda

6.  * (binario), el segundo
7.  /

1. b++ * c-- + 70 * 30 / 1
2. b++ * c-- + 2100
Ahora hago los incrementos, la multiplicación y la suma.
3. 101 * 29 + 2100
4. 2929 + 2100
5. 5029
Pero me dice que el resultado está mal. ?



El problema es que estás incrementando y restando inmediatamente, cuando deberían hacerlo después de la expresión. Ambos operadores en esta expresión son de resultado póstumo - a la evaluación de tal expresión. Es decir, realizamos el resultado del incremento después de tratar esta expresión; asimismo, el resultado del decremento aparece después de evaluar la expresión.

La sentencia original se puede reescribir así:

b * c + *q * m[2] / d;
c--;
b++;
obteniendo el mismo comportamiento y resultado. Como puedes ver, los resultados del incremento y de la resta aparecen después de la expresión (original).

Intenta hacer el ejercicio otra vez.

P.D.
En el ejercicio f, creo hay un error:
"++*p+++*q;"
Explican que es lo mismo que ++*p++ + *q.
1.++*p++ es 40->50, 50+1, 51.

2.51+*q es 51+70=121, pero el resultado que marca correcto es 111.

Nuevamente, 'p++' implica un incremento póstumo. Por lo tanto, el resultado del incremento aparece después de evaluar esta expresión. Podríamos reescribir la expresión original así:


++*p;*p + *q;
p++;
Como puedes ver, el preincremento implica que realizamos el incremento antes de evaluar la expresión (original), así que ya viene incrementado. Por el contrario, el postincremento provoca un incremento después de la expresión (original).


Espero haber aclarado las dudas.
Steven


_______________________________________________
Lista de correo Cconclase Cconclase en listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ 		 	   		  
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130120/0ad0823a/attachment.html>


Más información sobre la lista de distribución Cconclase