PREGUNTA: El siguiente fragmento de código en C/C++:
x = 2;
do{
printf("%d ", x);
x = x+1*2/3-1;
}while(x > 0);
a) Imprime: 2
b) Imprime: 2 1
c) Imprime: %d
d) Entra en un bucle infinito
RESPUESTA: La opción correcta es la b), se imprimirá 2 1. Analicemos lo que hace el programa: x comienza valiendo 2, entramos en el bucle, se muestra 2 por pantalla. Se ejecuta la operación que resulta ser x = 2 + 0,6667 - 1 = 1,6667 pero como x está declarada de tipo entero se trunca y queda valiendo 1 (hemos dicho se trunca, que no es redondear sino truncar). Ahora x entra valiendo 1, se imprime 1 y la operación es 1 + 0,6667 - 1 = 0,6667. Se trunca y ahora x vale cero. Se analiza la condición del while, y como x no es mayor que cero, se sale del bucle.
Fíjate si preguntáramos: ¿Qué ocurre al ejecutar esto?
int main(){
int x;
x = 2.85;
do{
printf("%d ", x);
x = x+1*2/3-1;
}while(x > 0);
return 0;
}
Pues que se imprime también 2 y 1. Como hemos dicho, aunque a x se le asigne 2.85 al estar declarada como tipo entero se trunca a la parte entera y x comienza valiendo 2. Resultado, se imprime 2 1.
¿Qué ocurre si truncamos un negativo como -2.85? Que nos trunca siempre a la parte entera, en este caso a -2.