Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO Pensar en C++ (Volumen 1) - Grupo ARCO
✐ ✐ ✐ “Volumen1” — 2012/1/12 — 13:52 — page 102 — #140 ✐ Capítulo 3. C en C++ 3.7.8. El operador ternario El if-else ternario es inusual porque tiene tres operandos. Realmente es un operador porque produce un valor, al contrario de la sentencia ordinaria if-else. Consta de tres expresiones: si la primera expresión (seguida de un ) se evalúa como cierto, se devuelve el resultado de evaluar la expresión que sigue al . Si la primera expresión es falsa, se ejecuta la tercera expresión (que sigue a :) y su resultado se convierte en el valor producido por el operador. El operador condicional se puede usar por sus efectos colaterales o por el valor que produce. A continuación, un fragmento de código que demuestra ambas cosas: a = --b b : (b = -99); Aquí, el condicional produce el rvalue. A a se le asigna el valor de b si el resultado de decrementar b es diferente de cero. Si b se queda a cero, a y b son ambas asignadas a -99. b siempre se decrementa, pero se asigna a -99 sólo si el decremento provoca que b valga 0. Se puede utilizar un sentencia similar sin el a = sólo por sus efectos colaterales: --b b : (b = -99); Aquí la segunda b es superflua, ya que no se utiliza el valor producido por el operador. Se requiere una expresión entre el y :. En este caso, la expresión puede ser simplemente una constante, lo que haría que el código se ejecute un poco más rápido. 3.7.9. El operador coma La coma no se limita a separar nombres de variables en definiciones múltiples, tales como int i, j, k; Por supuesto, también se usa en listas de argumentos de funciones. De todos modos, también se puede utilizar como un operador para separar expresiones - en este caso produce el valor de la última expresión. El resto de expresiones en la lista separada por comas se evalúa sólo por sus efectos colaterales. Este ejemplo incrementa una lista de variables y usa la última como el rvalue: //: C03:CommaOperator.cpp #include using namespace std; int main() { int a = 0, b = 1, c = 2, d = 3, e = 4; a = (b++, c++, d++, e++); cout
✐ ✐ ✐ “Volumen1” — 2012/1/12 — 13:52 — page 103 — #141 ✐ 3.7. Los operadores y su uso En general, es mejor evitar el uso de la coma para cualquier otra cosa que no sea separar, ya que la gente no está acostumbrada a verla como un operador. 3.7.10. Trampas habituales cuando se usan operadores Como se ha ilustrado anteriormente, una de las trampas al usar operadores es tratar de trabajar sin paréntesis incluso cuando no se está seguro de la forma en la que se va a evaluar la expresión (consulte su propio manual de C para comprobar el orden de la evaluación de las expresiones). Otro error extremadamente común se ve a continuación: //: C03:Pitfall.cpp // Operator mistakes int main() { int a = 1, b = 1; while(a = b) { // .... } } ///:~ La sentencia a = b siempre se va a evaluar como cierta cuando b es distinta de cero. La variable a obtiene el valor de b, y el valor de b también es producido por el operador =. En general, lo que se pretende es utilizar el operador de equivalencia (== dentro de una sentencia condicional, no la asignación. Esto le ocurre a muchos programadores (de todos modos, algunos compiladores advierten del problema, lo cual es una ayuda). Un problema similar es usar los operadores and y or de bits en lugar de sus equivalentes lógicos. Los operadores and y or de bits usan uno de los caracteres (& o |), mientras que los operadores lógicos utilizan dos (&& y ||). Al igual que con = y ==, es fácil escribir simplemente un carácter en vez de dos. Una forma muy fácil de recordarlo es que «los bits son mas pequeños, de modo que no necesitan tantos caracteres en sus operadores». 3.7.11. Operadores de moldeado La palabra molde(cast) se usa en el sentido de "colocar dentro de un molde". El compilador cambiará automáticamente un tipo de dato a otro si tiene sentido. De hecho, si se asigna un valor entero a una variable de punto flotante, el compilador llamará secretamente a una función (o más probablemente, insertará código) para convertir el int a un float. El molde permite hacer este tipo de conversión explicita, o forzarla cuando normalmente no pasaría. Para realizar un molde, se debe situar el tipo deseado (incluyendo todos los modificadores) dentro de paréntesis a la izquierda del valor. Este valor puede ser una variable, una constante, el valor producido por una expresión, o el valor devulto por una función. A continuación, un ejemplo: //: C03:SimpleCast.cpp int main() { int b = 200; 103 ✐ ✐ ✐ ✐
- Page 89 and 90: ✐ ✐ ✐ “Volumen1” — 2012
- Page 91 and 92: ✐ ✐ ✐ “Volumen1” — 2012
- Page 93 and 94: ✐ ✐ ✐ “Volumen1” — 2012
- Page 95 and 96: ✐ ✐ ✐ “Volumen1” — 2012
- Page 97 and 98: ✐ ✐ ✐ “Volumen1” — 2012
- Page 99 and 100: ✐ ✐ ✐ “Volumen1” — 2012
- Page 101 and 102: ✐ ✐ ✐ “Volumen1” — 2012
- Page 103 and 104: ✐ ✐ ✐ “Volumen1” — 2012
- Page 105 and 106: ✐ ✐ ✐ “Volumen1” — 2012
- Page 107 and 108: ✐ ✐ ✐ “Volumen1” — 2012
- Page 109 and 110: ✐ ✐ ✐ “Volumen1” — 2012
- Page 111 and 112: ✐ ✐ ✐ “Volumen1” — 2012
- Page 113 and 114: ✐ ✐ ✐ “Volumen1” — 2012
- Page 115 and 116: ✐ ✐ ✐ “Volumen1” — 2012
- Page 117 and 118: ✐ ✐ ✐ “Volumen1” — 2012
- Page 119 and 120: ✐ ✐ ✐ “Volumen1” — 2012
- Page 121 and 122: ✐ ✐ ✐ “Volumen1” — 2012
- Page 123 and 124: ✐ ✐ ✐ “Volumen1” — 2012
- Page 125 and 126: ✐ ✐ ✐ “Volumen1” — 2012
- Page 127 and 128: ✐ ✐ ✐ “Volumen1” — 2012
- Page 129 and 130: ✐ ✐ ✐ “Volumen1” — 2012
- Page 131 and 132: ✐ ✐ ✐ “Volumen1” — 2012
- Page 133 and 134: ✐ ✐ ✐ “Volumen1” — 2012
- Page 135 and 136: ✐ ✐ ✐ “Volumen1” — 2012
- Page 137 and 138: ✐ ✐ ✐ “Volumen1” — 2012
- Page 139: ✐ ✐ ✐ “Volumen1” — 2012
- Page 143 and 144: ✐ ✐ ✐ “Volumen1” — 2012
- Page 145 and 146: ✐ ✐ ✐ “Volumen1” — 2012
- Page 147 and 148: ✐ ✐ ✐ “Volumen1” — 2012
- Page 149 and 150: ✐ ✐ ✐ “Volumen1” — 2012
- Page 151 and 152: ✐ ✐ ✐ “Volumen1” — 2012
- Page 153 and 154: ✐ ✐ ✐ “Volumen1” — 2012
- Page 155 and 156: ✐ ✐ ✐ “Volumen1” — 2012
- Page 157 and 158: ✐ ✐ ✐ “Volumen1” — 2012
- Page 159 and 160: ✐ ✐ ✐ “Volumen1” — 2012
- Page 161 and 162: ✐ ✐ ✐ “Volumen1” — 2012
- Page 163 and 164: ✐ ✐ ✐ “Volumen1” — 2012
- Page 165 and 166: ✐ ✐ ✐ “Volumen1” — 2012
- Page 167 and 168: ✐ ✐ ✐ “Volumen1” — 2012
- Page 169 and 170: ✐ ✐ ✐ “Volumen1” — 2012
- Page 171 and 172: ✐ ✐ ✐ “Volumen1” — 2012
- Page 173 and 174: ✐ ✐ ✐ “Volumen1” — 2012
- Page 175 and 176: ✐ ✐ ✐ “Volumen1” — 2012
- Page 177 and 178: ✐ ✐ ✐ “Volumen1” — 2012
- Page 179 and 180: ✐ ✐ ✐ “Volumen1” — 2012
- Page 181 and 182: ✐ ✐ ✐ “Volumen1” — 2012
- Page 183 and 184: ✐ ✐ ✐ “Volumen1” — 2012
- Page 185 and 186: ✐ ✐ ✐ “Volumen1” — 2012
- Page 187 and 188: ✐ ✐ ✐ “Volumen1” — 2012
- Page 189 and 190: ✐ ✐ ✐ “Volumen1” — 2012
✐<br />
✐<br />
✐<br />
“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 102 — #140<br />
✐<br />
Capítulo 3. C <strong>en</strong> <strong>C++</strong><br />
3.7.8. El operador ternario<br />
El if-else ternario es inusual porque ti<strong>en</strong>e tres operandos. Realm<strong>en</strong>te es un<br />
operador porque produce un valor, al contrario de la s<strong>en</strong>t<strong>en</strong>cia ordinaria if-else.<br />
Consta de tres expresiones: si la primera expresión (seguida de un ) se evalúa como<br />
cierto, se devuelve el resultado de evaluar la expresión que sigue al . Si la primera<br />
expresión es falsa, se ejecuta la tercera expresión (que sigue a :) y su resultado se<br />
convierte <strong>en</strong> el valor producido por el operador.<br />
El operador condicional se puede usar por sus efectos colaterales o por el valor<br />
que produce. A continuación, un fragm<strong>en</strong>to de código que demuestra ambas cosas:<br />
a = --b b : (b = -99);<br />
Aquí, el condicional produce el rvalue. A a se le asigna el valor de b si el resultado<br />
de decrem<strong>en</strong>tar b es difer<strong>en</strong>te de cero. Si b se queda a cero, a y b son ambas asignadas<br />
a -99. b siempre se decrem<strong>en</strong>ta, pero se asigna a -99 sólo si el decrem<strong>en</strong>to provoca<br />
que b valga 0. Se puede utilizar un s<strong>en</strong>t<strong>en</strong>cia similar sin el a = sólo por sus efectos<br />
colaterales:<br />
--b b : (b = -99);<br />
Aquí la segunda b es superflua, ya que no se utiliza el valor producido por el<br />
operador. Se requiere una expresión <strong>en</strong>tre el y :. En este caso, la expresión puede<br />
ser simplem<strong>en</strong>te una constante, lo que haría que el código se ejecute un poco más<br />
rápido.<br />
3.7.9. El operador coma<br />
La coma no se limita a separar nombres de variables <strong>en</strong> definiciones múltiples,<br />
tales como<br />
int i, j, k;<br />
Por supuesto, también se usa <strong>en</strong> listas de argum<strong>en</strong>tos de funciones. De todos modos,<br />
también se puede utilizar como un operador para separar expresiones - <strong>en</strong> este<br />
caso produce el valor de la última expresión. El resto de expresiones <strong>en</strong> la lista separada<br />
por comas se evalúa sólo por sus efectos colaterales. Este ejemplo increm<strong>en</strong>ta<br />
una lista de variables y usa la última como el rvalue:<br />
//: C03:CommaOperator.cpp<br />
#include <br />
using namespace std;<br />
int main() {<br />
int a = 0, b = 1, c = 2, d = 3, e = 4;<br />
a = (b++, c++, d++, e++);<br />
cout