Unerwartete Endlosschleife bei while
-
Ohne lange zu Diskutieren will ich kurz und knapp mein Problem vorstellen.
(Bin noch ein C++ anfänger, doch erkenne das Problem hierbei nicht)bool a = true; while (a == true) { cout << "Dient zur Übersichtlichkeit" << endl; cin >> a; cout << endl; }Den eigentlichen Code habe ich natürlich bisschen abgeändert, doch das Problem sieht man hier ganz genau.
Unzwar wenn ich 1 eingebe macht die while-Schleife den nächsten durchlauf, bei 0 hört sie auf. Wenn ich jedoch was anderes eingebe wie z.B. 2, dann gerate ich in eine Endlosschleife und kann mir nicht erklären warum!
-
aist einbool, d.h. entwedertrueoderfalse. Dabei wird alles außer 0 zutrue, weswegen die Schleife auch durchläuft, wenn du 2 eingibst.
-
Dass cin >> a dann nichts mehr tut, liegt daran, dass das Fail- oder Badbit gesetzt ist (prüfen kannst du das mit cin.bad() oder cin.fail()).
-
schon klar, aber auch wenn ich eine 2 eingebe, müsste doch bei
cin >> a;eine abfrage stattfinden, was jedoch nicht passiert. Ich bekomme nur eine Endlosschleife mit der ersten cout Ausgabe.
-
a ist ein bool. Ein bool kann entweder true(=1) oder false(=0) sein. D.h. wenn du was anderes eingibst kommen Fehler. In deinem Fall eine Endlosschleife. Wenn du eine Schleife brauchst, die bei jeder ganzen Zahl weitermacht bis auf 0, probier doch sowas (ungetestet):
int a = 1; while (a!=0) { cout << "Dient zur Übersichtlichkeit" << endl; cin >> a; cout << endl; }Gruß
-
Die Zahl 2 lässt sich nicht in ein bool pressen, da ein bool nur aus einem Bit besteht. Dieses ist entweder 1 oder 0, also wahr oder falsch.
Der Stream setzt folglich das failbit, um einen Fehler zu signalisieren. Entweder du nutzt also lieber int, anstatt bool oder du musst auf das failbit reagieren.
#include <iostream> using namespace std; int main() { bool a = true; while (a == true) { cout << "Dient zur Übersichtlichkeit" << endl; cin >> a; cout << endl; if (cin.fail()) { a = true; cin.clear(); // Failbit löschen } } return 0; }Besser wäre es aber so:
#include <iostream> using namespace std; int main() { int a = 1; while (a != 0) { cout << "Dient zur Übersichtlichkeit" << endl; cin >> a; cout << endl; } return 0; }
-
Vielen Dank für die Antworten. Ich habe mir die cin.fail() Funktion angeschaut, schaut nützlich aus. Jedoch habe ich mich entschieden auf die int Mehtode zurückzugreifen

-
Noch ein kleiner Tipp. Du kannst hier eine fußgesteurte Schleife nutzen:
int a; do { cout << "Dient zur Übersichtlichkeit" << endl; cin >> a; cout << endl; } while (a != 0);Du sparst dir nämlich so die Initialisierung der Variable a, wenn du die Bedingung erst am Ende der Schleife prüfst.