[C con Clase] Varias dudas del curso

Salvador Pozo salvador en conclase.net
Jue Nov 22 23:44:18 CET 2007


El pasado 2007-11-22 22:03:36, David Reza escribió:

Hola:
 
DR> Hola a todos, he estado leyendo el curso de nuevo y me surgen ciertas dudas
DR> que antes no.

DR> > enum [<identificador_de_enum>] {
DR> >    <nombre> [= <valor>], ...} [lista_de_variables];
DR> >
DR> > El identificador de tipo es opcional, y nos permitirá declarar más
DR> > variables del tipo enumerado en otras partes del programa:
DR> >
DR> > [enum] <identificador_de_enum> <lista_de_identificadores>;
DR> 
DR> A qué se refiere que el identificador de tipo es opcional y cual es ese
DR> identificador de tipo? enum?

No, lo que es opcional es el identificador_de_enum o la lista_de_identificadores, aunque no se pueden omitir ambos a la vez.

Si te fijas, en la primera definición de la sintaxis, lo que aparece entre corchetes es [<identificador_de_enum>] y [lista_de_variables].

En la segunda definición la palabra enum sí aparece entre corchetes, pero esta definición sólo se puede usar en la declaración de variables (objetos) enum.

Son válidas las siguientes declaraciones de tipo:

enum {a, b, c, d} vble1;

enum tipoenumerado {x, y, z};

enum otrotipo {r, s, t} vble2;

Como verás, existen tres combinaciones: sin identificador de tipo, sin declaración de variables, o con ambas.

En el primer caso, no podremos declarar más variables del mismo tipo enumerado, ya que no existe un identificador para el tipo al que pertenece la variable "vble1".

Podremos declarar variables de los tipos "tipoenumerado" u "otrotipo", y en ese caso podemos omitir la palabra reservada "enum", que en C++ es opcional:

enum tipoenumerado vble3;
otrotipo vble4;

DR> 2.- En mis programas (de consola) no salen los acentos, ya que salen otras
DR> letras que sustituyen a las vocales con acentos.
DR> ¿Cómo puedo hacer que se visualicen correctamente los acentos?

Es complicado, ya que los editores de Windows trabajan con un conjunto de caracteres diferente al de la consola.

Una opción es editar el código fuente usando un editor de consola (edit.exe), el fuente generado de este modo contendrá los caracteres con acentos, eñes, etc que usa la consola.

Otras opciones consisten en usar los caracteres de Windows que, una vez compilado el programa, generen los caracteres que realmente queremos visualizar. Hay hilos en el foro que hablan de ese tema:

http://listas.conclase.net/?gid=2&mnu=mensajes&ord=fecha&msg=15058

DR> 3.- Es recomendable utilizar variables que sólo se utilizarán una vez? Por
DR> ejemplo, voy a sumar dos números y los tengo en dos variables ( a y b,
DR> respectivamente). Es una buena opción crear otra variable (digamos la
DR> variable c) y almacenar en ella la suma de las primeras dos y después
DR> imprimir c para mostrar el resultado o sería mejor imprimir el resultado
DR> como  a + b  y no desperdiciar memoria para una variable? - Sé que se
DR> desperdicia muy poca memoria en este caso pero es para dar la idea -

A mi modo de ver, crear una variable para usarla una sola vez no tiene mucho sentido. En el ejemplo que usas, yo no la usaría. De todos modos, depende de cada caso. La idea de usar una variable es poder usar su valor en varios puntos del programa.

Desde luego, el declarar o no una variable no debería depender sólo del espacio que ocupe. Si el programa va a quedar más claro usando una variable, adelante.

DR> 4.- En cuanto a los sufijos de precisión sencilla y doble, qué beneficios
DR> trae esto?
DR> Por qué hay diferencia entre precisión sencilla y doble.
DR> ¿No es lo mismo:
DR> float = 14.0;
DR> float = 14.0f;
DR> ?
DR> ¿Se puede hacer:
DR> double = 14.0;
DR> o
DR> double = 14.0f;
DR> ?
DR> ¿Qué diferencias hay?

En estos casos, poca. Efectivamente, se pueden hacer esas asignaciones, y el resultado es el mismo.

Cuando tiene más sentido usar los sufijos de precisión es cuando se usan constantes literales. El compilador siempre va a usar las precisiones predeterminadas. Si usamos una constante con valor 10, el compilador usará una representación int para almacenarla, si la usamos como 10.0, usará un double.

Si esos valores se usan en una comparación o en una asignación (ignorando las posibles optimizaciones que use el compilador), en ocasiones se tendrá que hacer una conversión de tipo durante la ejecución.

Por ejemplo:

int x = 10;
if(x == 10) cout << "x es 10" << endl;

En este caso no hay problema, en el "if" la constante 10 se almacena como un int, y se compara con un int.

Pero:

float x = 10.0f;
if(x == 10) cout << "x es 10" << endl;

Ahora la constante también se almacena como un int, pero se compara con un float, por lo tanto, se debe convertir a float antes de hacer la comparación. Lo malo es que esa converión se hace cuando se ejecuta el programa, y requerirá un tiempo extra de ejecución cada vez. Si hubiéramos escrito 10.0f, la conversión se hace en la compilación, y la ejecución es más rápida.

DR> 5.- En el capítulo 007, sección Constantes "char" qué significa la última
DR> parte:
DR> \O   cualquiera O=tres dígitos en octal  \xH   cualquiera H=número
DR> hexadecimal  \XH   cualquiera H=número hexadecima
DR> > Los tres últimos son realmente comodines para la representación de
DR> > cualquier carácter. El \nnn sirve para la representación en notación octal.

Significa que podemos usar secuencias de escape para usar valores ASCII que no podemos escribir desde el teclado, usando distintas notaciones.

Por ejemplo:
char a = '\123';

Asigna a "a" el valor del carácter 123 expresado en octal.

char a = '\x2f';

Asigna a "a" el valor del carácter 2f expresado en hexadecimal.

Hasta pronto.

-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net


Más información sobre la lista de distribución Cconclase