Hola. Muy buenas a todos. Hoy traigo una duda de las que uno piensa que el compilador está fallando porque no tiene otra explicación.
Primero voy a introducir: Estoy intentando imitar la clase string a modo de ejercicio. Pues bien, en el constructor está pasado algo solo descriptible a través de la salida (está debajo del código).
String::String(const char *init_value) {
unsigned int num_characters = 0;
while(init_value[num_characters] != (char)NULL)
num_characters += 1;
_num_characters = num_characters;
_value = (char *)malloc(num_characters + 1);
_value[num_characters] = (char)0;
while(--num_characters >= 0) {
printf("%d ", num_characters); // _value[num_characters] = init_value[num_characters];
}
}
Pues bien, la salida es la siguiente:
3 2 1 0 -1 -2 -3 -4 //... y así hasta el infinito
(El comentario no está en la salida, solo es para aclarar)
Como ven, aunque num_characters valga menos de 0, el while se sigue repitiendo...
Espero que sea error del compilador, porque si no yo sería muy tonto
num_characters es unsigned, no tiene signo, siempre sera >= 0 (por mucho que num_characeters sea 0 cumple que == 0 y continuara el while y pasara de 0 a un número gigante.
Yo haría un while(--num_characters) y cuando sea 0 ya para.
... Por eso algunas veces me siento tonto. Claro xD Gracias!
Para el que le interese, aquí le dejo el código con el error solucionado :D
String::String(const char *init_value) {
unsigned int num_characters = 0;
while(init_value[num_characters] != (char)NULL)
num_characters += 1;
_num_characters = num_characters;
_value = (char *)malloc(num_characters + 1);
_value[num_characters] = (char)0;
while(true) {
--num_characters;
_value[num_characters] = init_value[num_characters];
if(num_characters == 0)
break;
}
}
Así también es una opción:
++num_characters;
while (num_characters-- > 0)
printf("%u ", num_characters);
Y si desplazas el postdecremento una posición:
++num_characters;
while (num_characters --> 0)
printf("%u ", num_characters);
parece una flechita :)