tablas - C++ Evaluación booleana
simplificacion de expresiones booleanas ejercicios resueltos (2)
Entonces tengo curiosidad de por qué sucede esto.
int main()
{
bool answer = true;
while(answer)
{
cout << "/nInput?/n";
cin >> answer;
}
return 0;
}
Comportamiento esperado: 0 - Sale del programa, 1 - Solicita nuevamente, Cualquier entero distinto de cero que no sea 1 - Solicita de nuevo
Comportamiento real: 0 - Como se esperaba, 1 - Como se esperaba, Cualquier entero distinto de cero distinto de 1 - Bucle infinito
De http://www.learncpp.com/cpp-tutorial/26-boolean-values/
One additional note: when converting integers to booleans,
the integer zero resolves to boolean false,
whereas non-zero integers all resolve to true.
¿Por qué el programa entra en un ciclo infinito?
En efecto, la sobrecarga del operator>> utilizada para leer un bool solo permite un valor de 0 o 1 como entrada válida. La sobrecarga del operador se num_get la plantilla de la clase num_get , que lee el siguiente número del flujo de entrada y luego se comporta de la siguiente manera (C ++ 11 §22.4.2.1 / 6):
Si el valor que se almacenará es
0, se almacenafalse.Si el valor es
1entonces se almacenatrue.De lo contrario,
truese almacena yios_base::failbitse asigna aerr.
( err aquí está el estado de error de la secuencia desde la que está leyendo; cin en este caso. Tenga en cuenta que hay un lenguaje adicional que especifica el comportamiento cuando se boolalpha manipulador boolalpha , que permite insertar y extraer booleanos usando sus nombres, true y false ; he omitido estos otros detalles por brevedad).
Cuando ingresa un valor distinto de cero o uno, el estado de falla se establece en la secuencia, lo que hace que las extracciones adicionales fallen. answer se establece en true y permanece true para siempre, causando el ciclo infinito.
Debe probar el estado de la secuencia después de cada extracción, para ver si la extracción tuvo éxito y si la transmisión aún se encuentra en buen estado. Por ejemplo, puede reescribir su ciclo como:
bool answer = true;
while (std::cin && answer)
{
std::cout << "/nInput?/n";
std::cin >> answer;
}
Porque el operator>> falla si la entrada no es 0 o 1, y cuando falla, no consume entrada. Entonces, el ciclo consiste en leer el dígito y luego quitarlo, varias veces.
Intenta cambiar el código así para verlo:
if (cin >> answer) {
cout << answer << endl;
} else {
cerr << "oops" << endl;
break;
}