[C con Clase] Precedencia de operadores

Davidson, Steven srd4121 en njit.edu
Dom Ene 20 03:17:30 CET 2013


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
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130119/1830c5a1/attachment.html>


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