[C con Clase] acerca del rendimiento de strlen

Steven Davidson steven en conclase.net
Jue Mar 15 06:38:08 CET 2007


Hola Miguel,

El pasado 2007-03-15 02:14:10, miguel escribió:

[CORTE]

m> int main(){
m>   char szCadena[] = "una cadena"; 
m>   cout<<sizeof (szCadena)/sizeof(char);
m>   return 0;
m> }
m> el resultado será 11 y no 4 como el que resulta al usar el ejemplo expuesto por tí (que por cierto también resulta si creamos la cadena como char *szCadena = "una cadena";)

Exacto. El array 'szCadena' consistirá de 11 caracteres, por lo que 'sizeof' informará de 11 bytes, ya que 'char' siempre ocupa 1 byte. Sin embargo, la cadena en 'szCadena' ocupa 10 caracteres que es justamente lo que retorna 'strlen()'.

m> en cuanto a lo otro que respondiste:
m> S>Pues sí; parece que has estado enfocado más con Java que con C++ :)  Lo anterior, bajo C/C++, es incorrecto. Debería ser:
m> char pCadena[] = "hola mundo"; 
m> me gustaría saber el por qué, ya que no entiendo muy bien por qué está mal definido (o por lo menos no óptimamente definido), aunque creando algunos ejemplos creo que el error se genera al crear varias variables de la forma en que yo lo estaba haciendo, algo como
m> char []a="hola", b='a';
m> genera un error de compilación, pero me gustaría (si es posible) una explicación acerca de esto.

No tiene nada que ver con la optimización. Sencillamente, escribir:
char []a = "hola";
es incorrecto bajo C/C++. La forma correcta de declarar e inicializar un array es de la siguiente manera:
char a[] = "hola";

O incluso, indicando el tamaño:
char a[5] = "hola";

Bajo Java, podemos variar la colocación de los símbolos []; esto es,
char []a = "hola";

es tan válido como,
char a[] = "hola";


La razón de que sea correcto bajo C/C++ tiene que ver con el operador []. Cuando un operador es usado para declarar una variable, entonces técnicamente se le llama un declarador. Los declaradores son tratados exactamente como a los operadores, pero sin realizar una operación; por esto no se les llama operadores. Esto significa que se mantienen las reglas gramaticales tanto para los operadores como para los declaradores como son la precedencia y asociación.

Dicho lo anterior, el operador [] como su declarador son binarios y por tanto aparece a la derecha de la variable con un número entero constante en su "interior". De la misma manera, el operador y declarador * unitario aparece a la izquierda de la variable o valor. Cuando existen varios declaradores, entonces se aplican las reglas de precedencia y asociación, como se hace con los operadores.

m> Por cierto, aunque me salgo algo del tema, gracias Steven por la info acerca de blender (no quise abrir otro post solo de agradecimiento, ya que podría considerarse spam), en realidad me ha servido (parece que aún no me expreso muy bien frente a google, pero intentaré mejorar), estoy leyendo con gran entusiasmo el tema, nuevamente gracias.

De nada; para eso estamos. :D


Espero que lo anterior te aclare las dudas.

Steven


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