Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO Pensar en C++ (Volumen 1) - Grupo ARCO

arco.esi.uclm.es
from arco.esi.uclm.es More from this publisher
13.01.2015 Views

✐ ✐ ✐ “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 ✐ ✐ ✐ ✐

✐<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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!