<div dir="ltr">Hola B.Amauri,<div class="gmail_extra"><br>2013/1/19 amauri d <span dir="ltr"><<a href="mailto:b_duhart@live.com.mx" target="_blank">b_duhart@live.com.mx</a>></span><br><div class="gmail_quote"><div><br>
</div><div>[CORTE]<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div dir="ltr">
Ej:<br>"Dadas las siguientes variables:<br><code><b>int</b> a = 10, b = 100, c = 30, d = 1, e = 54;<br><b>int</b> m[10] = {10,20,30,40,50,60,70,80,90,100};<br><b>int</b> *p = &m[3], *q = &m[6];</code><br>Evaluar, sin usar un compilador, las siguientes expresiones.<br>
Considerar que los resultados de cada una de las expresiones no influyen en las siguientes:<br>d) <code> b++ * c-- + *q * m[2] / d;"<br><br>Según yo, primero sustituyo *q y m[2] por la precedencia, segundo, realizo las multiplicaciones y </code></div>
</div></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div dir="ltr"><code>divisiones, que no están implicadas con ++ ni con -- (con una mayor precedencia que estas), debido a que los separa una suma.<br>
</code></div></div></blockquote><div><br></div><div>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 /.<br>
</div><div><br></div><div style>Resumiendo, el orden de evaluación es el siguiente:<br><br></div><div style>1.  []</div><div style>2.  * (unitario)</div><div style>3.  --</div><div style>4.  ++</div><div style>5.  * (binario), el primero a mano izquierda<br>
6.  * (binario), el segundo<br>7.  /</div><div style><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div><div dir="ltr"><code>1. b++ * c-- + 70 * 30 / 1<br>2. </code><code><code>b++ * c-- + 2100<br>Ahora hago los incrementos, la multiplicación y la suma.<br>3. 101 * 29 + 2100<br>4. 2929 + 2100<br>5. 5029<br>Pero me dice que el resultado está mal. ?<br>
<br></code></code></div></div></blockquote><div><br></div><div style>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.</div>
<div style><br></div><div style>La sentencia original se puede reescribir así:<br><br>b * c + *q * m[2] / d;<br>c--;<br></div><div style>b++;</div><div><br></div><div style>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).</div>
<div style><br></div><div style>Intenta hacer el ejercicio otra vez.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div><div dir="ltr"><code><code>P.D.<br>En el ejercicio f, creo hay un error:<br>"</code></code><code><code><code>++*p+++*q;</code>"<br>Explican que es lo mismo que ++*p++ + *q.<br>1.++*p++ es 40->50, 50+1, 51.<br>
2.51+*q es 51+70=121, pero el resultado que marca correcto es 111.<br></code></code></div></div></blockquote><div><br></div><div style>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í:<br>
<br>++*p;</div><div style>*p + *q;<br></div><div style>p++;</div><div style><br></div><div style>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).</div>
<div><br></div><div><br></div><div style>Espero haber aclarado las dudas.</div><div><br></div><div style>Steven</div><div style><br></div></div></div></div>