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
1
entonces se almacenatrue
.De lo contrario,
true
se almacena yios_base::failbit
se 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;
}