verdad tablas simplificar simplificacion resueltos online miniterminos maxiterminos expresiones ejercicios ejemplos definicion booleanas booleana c++ boolean type-conversion iostream

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 almacena false .

  • Si el valor es 1 entonces se almacena true .

  • De lo contrario, true se almacena y ios_base::failbit se asigna a err .

( 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; }