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 76 — #114 ✐ Capítulo 3. C en C++ Si se ha estado preguntando acerca del nombre «C++», ahora lo entenderá. Significa «un paso más allá de C» 3 3.4. Introducción a los tipos de datos Los tipos de datos definen el modo en que se usa el espacio (memoria) en los programas. Especificando un tipo de datos, está indicando al compilador como crear un espacio de almacenamiento en particular, y también como manipular este espacio. Los tipos de datos pueden estar predefinidos o abstractos. Un tipo de dato predefinido es intrínsecamente comprendido por el compilador. Estos tipos de datos son casi idénticos en C y C++. En contraste, un tipo de datos definido por el usuario es aquel que usted o cualquier otro programador crea como una clase. Estos se denominan comúnmente tipos de datos abstractos. El compilador sabe como manejar tipos predefinidos por si mismo; y «aprende» como manejar tipos de datos abstractos leyendo los ficheros de cabeceras que contienen las declaraciones de las clases (esto se verá con más detalle en los siguientes capítulos). 3.4.1. Tipos predefinidos básicos La especificación del Estándar C para los tipos predefinidos (que hereda C++) no indica cuantos bits debe contener cada uno de ellos. En vez de eso, estipula el mínimo y máximo valor que cada tipo es capaz de almacenar. Cuando una máquina se basa en sistema binario, este valor máximo puede ser directamente traducido a un numero mínimo necesario de bits para alojar ese valor. De todos modos, si una maquina usa, por ejemplo, el código binario decimal (BCD) para representar los números, entonces el espacio requerido para alojar el máximo número para cada tipo de datos será diferente. El mínimo y máximo valor que se puede almacenar en los distintos tipos de datos se define en los ficheros de cabeceras del sistema limits.h y float.h (en C++ normalmente será #include y ). C y C++ tienen cuatro tipos predefinidos básicos, descritos aquí para máquinas basadas en sistema binario. Un char es para almacenar caracteres y utiliza un mínimo de 8 bits (un byte) de espacio, aunque puede ser mas largo. Un int almacena un número entero y utiliza un mínimo de dos bytes de espacio. Los tipos float y el double almacenan números con coma flotante, usualmente en formato IEEE. el float es para precisión simple y el double es para doble precisión. Como se ha mencionado previamente, se pueden definir variables en cualquier sitio en un ámbito determinado, y puede definirlas e inicializarlas al mismo tiempo. A continuación se indica cómo definir variables utilizando los cuatro tipos básicos de datos: //: C03:Basic.cpp // Defining the four basic data // types in C and C++ int main() { // Definition without initialization: char protein; int carbohydrates; float fiber; 3 (N. de T.) ...aunque se evalúa como «C». 76 ✐ ✐ ✐ ✐
✐ ✐ ✐ “Volumen1” — 2012/1/12 — 13:52 — page 77 — #115 ✐ 3.4. Introducción a los tipos de datos double fat; // Simultaneous definition & initialization: char pizza = ’A’, pop = ’Z’; int dongdings = 100, twinkles = 150, heehos = 200; float chocolate = 3.14159; // Exponential notation: double fudge_ripple = 6e-4; } ///:~ La primera parte del programa define variables de los cuatro tipos básicos sin inicializarlas. Si no se inicializa una variable, el Estándar dice que su contenido es indefinido (normalmente, esto significa que contienen basura). La segunda parte del programa define e inicializa variables al mismo tiempo (siempre es mejor, si es posible, dar un valor inicial en el momento de la definición). Note que el uso de notación exponencial en la contante 6e-4, significa «6 por 10 elevado a -4». 3.4.2. booleano, verdadero y falso Antes de que bool se convirtiese en parte del Estándar C++, todos tendían a utilizar diferentes técnicas para producir comportamientos similares a los booleanos. Esto produjo problemas de portabilidad y podían acarrear errores sutiles. El tipo bool del Estándar C++ puede tener dos estados expresados por las constantes predefinidas true (lo que lo convierte en el entero 1) y false (lo que lo convierte en el entero 0). Estos tres nombres son palabras reservadas. Además, algunos elementos del lenguaje han sido adaptados: Elemento Uso con booleanos && || ! Toman argumentos booleanos y producen valores bool < > = == != Producen resultados bool if, for, while, do Las expresiones condicionales se convierten en valores bool : El primer operando se convierte a un valor bool Cuadro 3.1: Expresiones que utilizan booleanos Como hay mucho código existente que utiliza un int para representar una bandera, el compilador lo convertirá implícitamente de int a bool (los valores diferentes de cero producirán true, mientras que los valores cero, producirán false). Idealmente, el compilador le dará un aviso como una sugerencia para corregir la situación. Un modismo que se considera «estilo de programación pobre» es el uso de ++ para asignar a una bandera el valor true. Esto aún se permite, pero está obsoleto, lo que implica que en el futuro será ilegal. El problema es que se está haciendo una conversión implícita de un bool a un int, incrementando el valor (quizá más allá del rango de valores booleanos cero y uno), y luego implícitamente convirtiéndolo otra vez a bool. Los punteros (que se describen más adelante en este capitulo) también se convierten automáticamente a bool cuando es necesario. 77 ✐ ✐ ✐ ✐
- Page 63 and 64: ✐ ✐ ✐ “Volumen1” — 2012
- Page 65 and 66: ✐ ✐ ✐ “Volumen1” — 2012
- Page 67 and 68: ✐ ✐ ✐ “Volumen1” — 2012
- Page 69 and 70: ✐ ✐ ✐ “Volumen1” — 2012
- Page 71 and 72: ✐ ✐ ✐ “Volumen1” — 2012
- Page 73 and 74: ✐ ✐ ✐ “Volumen1” — 2012
- Page 75 and 76: ✐ ✐ ✐ “Volumen1” — 2012
- Page 77 and 78: ✐ ✐ ✐ “Volumen1” — 2012
- Page 79 and 80: ✐ ✐ ✐ “Volumen1” — 2012
- Page 81 and 82: ✐ ✐ ✐ “Volumen1” — 2012
- Page 83 and 84: ✐ ✐ ✐ “Volumen1” — 2012
- Page 85 and 86: ✐ ✐ ✐ “Volumen1” — 2012
- Page 87 and 88: ✐ ✐ ✐ “Volumen1” — 2012
- 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: ✐ ✐ ✐ “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 and 140: ✐ ✐ ✐ “Volumen1” — 2012
- Page 141 and 142: ✐ ✐ ✐ “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
✐<br />
✐<br />
✐<br />
“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 77 — #115<br />
✐<br />
3.4. Introducción a los tipos de datos<br />
double fat;<br />
// Simultaneous definition & initialization:<br />
char pizza = ’A’, pop = ’Z’;<br />
int dongdings = 100, twinkles = 150,<br />
heehos = 200;<br />
float chocolate = 3.14159;<br />
// Expon<strong>en</strong>tial notation:<br />
double fudge_ripple = 6e-4;<br />
} ///:~<br />
La primera parte del programa define variables de los cuatro tipos básicos sin<br />
inicializarlas. Si no se inicializa una variable, el Estándar dice que su cont<strong>en</strong>ido es<br />
indefinido (normalm<strong>en</strong>te, esto significa que conti<strong>en</strong><strong>en</strong> basura). La segunda parte del<br />
programa define e inicializa variables al mismo tiempo (siempre es mejor, si es posible,<br />
dar un valor inicial <strong>en</strong> el mom<strong>en</strong>to de la definición). Note que el uso de notación<br />
expon<strong>en</strong>cial <strong>en</strong> la contante 6e-4, significa «6 por 10 elevado a -4».<br />
3.4.2. booleano, verdadero y falso<br />
Antes de que bool se convirtiese <strong>en</strong> parte del Estándar <strong>C++</strong>, todos t<strong>en</strong>dían a utilizar<br />
difer<strong>en</strong>tes técnicas para producir comportami<strong>en</strong>tos similares a los booleanos.<br />
Esto produjo problemas de portabilidad y podían acarrear errores sutiles.<br />
El tipo bool del Estándar <strong>C++</strong> puede t<strong>en</strong>er dos estados expresados por las constantes<br />
predefinidas true (lo que lo convierte <strong>en</strong> el <strong>en</strong>tero 1) y false (lo que lo convierte<br />
<strong>en</strong> el <strong>en</strong>tero 0). Estos tres nombres son palabras reservadas. Además, algunos<br />
elem<strong>en</strong>tos del l<strong>en</strong>guaje han sido adaptados:<br />
Elem<strong>en</strong>to<br />
Uso con booleanos<br />
&& || !<br />
Toman argum<strong>en</strong>tos booleanos y<br />
produc<strong>en</strong> valores bool<br />
< > = == != Produc<strong>en</strong> resultados bool<br />
if, for, while, do<br />
Las expresiones condicionales se<br />
conviert<strong>en</strong> <strong>en</strong> valores bool<br />
:<br />
El primer operando se convierte a un<br />
valor bool<br />
Cuadro 3.1: Expresiones que utilizan booleanos<br />
Como hay mucho código exist<strong>en</strong>te que utiliza un int para repres<strong>en</strong>tar una bandera,<br />
el compilador lo convertirá implícitam<strong>en</strong>te de int a bool (los valores difer<strong>en</strong>tes de<br />
cero producirán true, mi<strong>en</strong>tras que los valores cero, producirán false). Idealm<strong>en</strong>te,<br />
el compilador le dará un aviso como una suger<strong>en</strong>cia para corregir la situación.<br />
Un modismo que se considera «estilo de programación pobre» es el uso de ++<br />
para asignar a una bandera el valor true. Esto aún se permite, pero está obsoleto,<br />
lo que implica que <strong>en</strong> el futuro será ilegal. El problema es que se está haci<strong>en</strong>do una<br />
conversión implícita de un bool a un int, increm<strong>en</strong>tando el valor (quizá más allá del<br />
rango de valores booleanos cero y uno), y luego implícitam<strong>en</strong>te convirtiéndolo otra<br />
vez a bool.<br />
Los punteros (que se describ<strong>en</strong> más adelante <strong>en</strong> este capitulo) también se conviert<strong>en</strong><br />
automáticam<strong>en</strong>te a bool cuando es necesario.<br />
77<br />
✐<br />
✐<br />
✐<br />
✐