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

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

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

Saved successfully!

Ooh no, something went wrong!