Vale, ahora entiendo la diferencia y la utilidad de ?, gracias.<br><br>Solo por si alguien lo lee despues, creo que los dos codigos no hacen lo mismo:<br><br>1) <b>if ( -1==cond ) { fprintf(stderr, "ERROR: %s.\n", ERRORS[errn]); return -1 ;}<br>
 </b>Que tabulado seria esto<br><b>if</b> <b>(</b> <i>-1</i><b>==</b>cond<b> )</b><br><b>{</b><br> fprintf(stderr, <i>"ERROR: %s.\n"</i>, ERRORS[errn])<b>;</b><br> return <i>-1</i> <b>;</b><br><b>}</b><br><br>2) -1==cond ? fprintf(stderr, "ERROR: %s.\n", ERRORS[errn]) : -1<br>
 Que es equivalente a declarar esta funcion: (pongo ints en lugar de bools porque todavia no tengo muy claro en C++ como va)<br><b> int</b> interrogante ( <b>int </b>exprBool )<br> <b>{</b><br>  <b>if (</b> cond <b>)</b><br>
   <b>return(</b> fprintf(stderr, <i>"ERROR: %s.\n"</i>, ERRORS[errn])<b> );</b><br><b> else</b><br>   <b>return</b> <i>-1</i><b>;</b><br><b> }<br></b>Y utilizarla luego asi:<br><b> interrogante(<i> -1</i> ==</b> cond <b>);<br>
</b><br>Espero no haberme equivocado, solo lo pongo por evitar posibles confusiones en posteriores lecturas del hilo.<br><br>Gracias a todos por vuestro tiempo y ayuda.<br><div class="gmail_quote">2009/3/5 Steven Davidson <span dir="ltr"><<a href="mailto:srd4121@njit.edu">srd4121@njit.edu</a>></span><br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div class="im">Hola Vicente,<br>
<br>
vicente lozano wrote:<br>
</div><div class="im"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Que diferencia a bajo nivel hay entre el uso de ? y el if, en que se traducen en ensamblador?<br>
<br>
</blockquote>
<br></div>
Programante ya te ha contestado, pero quería agregar a lo que dijo.<br>
<br>
En tu caso, estabas usando 'if' dentro de una macro. Lo cambié por el operador ?: porque así la macro se basa en una expresión y no en una sentencia. Así podíamos usar la macro prácticamente en cualquier lugar. Para que se vea claramente este tema, pongo las macros:<br>

<br>
#define check_if(cond,errn)\<br>
  if ( -1==cond ) { fprintf(stderr, "ERROR: %s.\n", ERRORS[errn]); return -1 ;}<br>
<br>
#define check_op(cond,errn)\<div class="im"><br>
  ( -1==cond ? fprintf(stderr, "ERROR: %s.\n", ERRORS[errn]) : -1 )<br>
<br></div>
int main()<br>
{<br>
  int cond;<br>
<br>
  do<br>
  {<br>
    ...<br>
  } while( check_if(cond,0) != -1 );<br>
<br>
  return 0;<br>
}<br>
<br>
Esto no funcionaría y el compilador te habría dado un sinfín de errores gramaticales. Esto es porque realmente estarías escribiendo lo siguiente:<br>
<br>
do<br>
{<br>
  ...<br>
} while( if ( -1==cond ) { fprintf(stderr, "ERROR: %s.\n", ERRORS[0]); return -1 ;} != -1 );<br>
<br>
Como puedes ver, esto no tiene ni pies ni cabezas, porque dentro de 'while' se espera una expresión, pero en su lugar se encuentra una sentencia.<br>
<br>
Si por el contrario, usamos la versión ?:, entonces tenemos lo siguiente:<br>
<br>
do<br>
{<br>
  ...<br>
} while( check_op(cond,0) != -1 );<br>
<br>
Esto se traduciría a lo siguiente:<br>
<br>
do<br>
{<br>
  ...<br>
} while( ( -1==cond ? fprintf(stderr, "ERROR: %s.\n", ERRORS[0]) : -1 ) != -1 );<br>
<br>
Obviamente, esto sí está permitido, porque el operador ?: es válido dentro de 'while'.<br>
<br>
<br>
El grave problema de las macros es que son muy traicioneras si no están bien definidas ni bien usadas. Los programadores que piensan que las macros son funciones les espera una sorpresa desagradable. Por eso, en C++, se desaconseja usar macros y usar funciones, porque tenemos ciertas expectativas acerca del funcionamiento de las funciones - valga la redundancia.<br>

<br>
<br>
Espero haber aclarado el tema.<br><font color="#888888">
<br>
Steven</font><div><div></div><div class="h5"><br>
<br>
<br>
_______________________________________________<br>
Lista de correo Cconclase <a href="mailto:Cconclase@listas.conclase.net" target="_blank">Cconclase@listas.conclase.net</a><br>
<a href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net" target="_blank">http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net</a><br>
Bajas: <a href="http://listas.conclase.net/index.php?gid=2&mnu=FAQ" target="_blank">http://listas.conclase.net/index.php?gid=2&mnu=FAQ</a><br>
</div></div></blockquote></div><br>