<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 12pt;
font-family:Calibri
}
--></style></head>
<body class='hmmessage'><div dir='ltr'>Steven, great!<br>Gracias ya los pude resolver todos. Como resumen:<br>1. Evalúo primero de acuerdo con la precedencia de los operadores.<br>2. Para operadores equitativos, leo la expresión de derecha a izquierda o viceversa, según sea el caso.<br>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.<br><br>B.Amauri.<div><div id="SkyDrivePlaceholder"></div><hr id="stopSpelling">Date: Sat, 19 Jan 2013 21:17:30 -0500<br>From: srd4121@njit.edu<br>To: cconclase@listas.conclase.net<br>Subject: Re: [C con Clase] Precedencia de operadores<br><br><div dir="ltr">Hola B.Amauri,<div class="ecxgmail_extra"><br>2013/1/19 amauri d <span dir="ltr"><<a href="mailto:b_duhart@live.com.mx">b_duhart@live.com.mx</a>></span><br><div class="ecxgmail_quote"><div><br>
</div><div>[CORTE]<br></div><div> </div><blockquote class="ecxgmail_quote" style="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="ecxgmail_quote" style="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>Resumiendo, el orden de evaluación es el siguiente:<br><br></div><div>1.  []</div><div>2.  * (unitario)</div><div>3.  --</div><div>4.  ++</div><div>5.  * (binario), el primero a mano izquierda<br>
6.  * (binario), el segundo<br>7.  /</div><div><br></div><blockquote class="ecxgmail_quote" style="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>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><br></div><div>La sentencia original se puede reescribir así:<br><br>b * c + *q * m[2] / d;<br>c--;<br></div><div>b++;</div><div><br></div><div>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><br></div><div>Intenta hacer el ejercicio otra vez.</div><div><br></div><blockquote class="ecxgmail_quote" style="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>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>*p + *q;<br></div><div>p++;</div><div><br></div><div>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>Espero haber aclarado las dudas.</div><div><br></div><div>Steven</div><div><br></div></div></div></div>
<br>_______________________________________________
Lista de correo Cconclase Cconclase@listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ</div>                                         </div></body>
</html>