[C con Clase] Normas notación (sufijos) [DUDA]

Steven Davidson srd4121 en njit.edu
Mar Ago 25 20:49:20 CEST 2009


Hola Daniel,

Rido wrote:
> Bueno este es mi primer mensaje. Gracias al creador de la web por tan

Muchas gracias. Hacemos lo que podemos :)

> magnífica idea. Paso a postear mi duda, que supongo que para vosotros
> será algo bastante fácil.
> 

Veamos las dudas.

> Veréis, a la hora de las normas de notación, se dice que las
> variables constantes hay que expresarlas correctamente para no tener
> errores. Por ejemplo si es una variable constante long, ponerla con
> el sufijo "L". Eso lo entiendo porn ejemplo en la segunda línea del
> siguiente código:
> 
> long x = 123L;
> if(x == 0L) cout << "Valor nulo" << endl;
> 
> No obstante, en la primera línea del código anterior, la variable
> está definida como long ya de por sí, así que no veo por qué hace
> falta ponerle un sufijo "L" si ya estaba definida como long.
> 

Ciertamente, podríamos dispensar del sufijo en este caso, porque el 
compilador promocionará los tipos de los valores para que concuerden con 
la semántica de la operación. En este caso, el compilador quiere 
encontrarse con la siguiente operación:

<long int> == <long int>

Al encontrarse con la siguiente expresión,

x == 0

el compilador cambiará el tipo de 0 para que concuerde con el tipo esperado.

Indicamos el tipo con el sufijo para dar mayor claridad de lo que 
queremos tanto para nosotros como para el compilador.

No sé si habrás llegado a ver la sobrecarga (u homonimia) de las 
funciones y de los operadores, pero en C++ podemos tener diferentes 
"versiones" de función con el mismo nombre. Por ejemplo,

void func( long int a );
void func( int a );
void func( short int a );

Si hiciéramos lo siguiente,

func( 5 );

Acabaríamos invocando la versión 'func(int)'. En este otro ejemplo, la 
invocación será diferente, debido al tipo del dato pasado por parámetro:

func( 5L );

Se invocaría 'func(long int)'.

Como puedes ver, podemos hacer cosas diferentes dependiendo del tipo, 
por lo que es sumamente importante indicar el tipo del dato a pasar. Si 
no es necesario indicarlo explícitamente, al menos lo hacemos por la 
legibilidad del programa.

> Como segunda duda, tengo el por qué el "endl;" termina en una l y no
> simplemente en "end;"
> 
> Quizá me salte algo que se haya leído anteriormente, pero no recuerdo
> nada parecido :-S
> 

'endl' es un manipulador estándar en <ostream> que significa en inglés 
"end of line", para terminar una línea. Existe otro manipulador estándar 
llamado 'ends', también en <ostream>, que significa "end of string", 
para terminar una cadena.


Espero haber aclarado las dudas.

Steven





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