Dlaczego pętla jest nieskonczona, nawet jesli wprowadze char kończący warunek?

0

Nie wiem dlaczego moja pętla jest nieskonczona nawet jesli wprowadze char kończący warunek. Pomoże ktoś pls?

#include <iostream>
#include <fstream>
#include <windows.h>
#include <conio.h>
using namespace std;
char wybor;
string dane;
int main()
{
        do
        {
            cout << "Wprowadz dane: ";
            getline(cin, dane);
            cout << "IF YOU WANT SAVE TO FILE PRESS  ( y )  to save to file, or  ( n )  to exit to menu.";
            wybor=getch();
            switch (wybor)
                {
                case 'y':
                    {
                    ofstream plik;
                    plik.open("Dane.txt",ios::out|ios::app);
                    plik << dane <<endl<<endl;
                    cout << "Zapisano dane"<<endl;
                    plik.close();
                    system("PAUSE");
                    }
                break;
                }
        }
        while (wybor!='y'||'n');

    return 0;
}
4

While oznacza - rób dopóki warunek jest spełniony, czyli kończy gdy warunek nie jest spełniony.
Zatem

while (wybor!='y'||'n');

zamień na

while (wybor != 'y' && wybor != 'n');
0

Dzięki piękne działa, ale zastanawia się dlaczego operator or tutaj nie mogł byc użyty

1

Może być użyty, ale w ten sposób:

while (wybor == 'y' || wybor == 'n');
0

Hmm ten tez wkleilem u siebie ale dziala w nieskonczonosc...

Edit: w przypadku nacisnięcia 'y' lub 'n', natomiast we wszystkich innych wypadkach konczy pracę. Troche to dziwne, zostanę przy &&

2

A no tak, jeszcze trzeba zanegować całość, jak @szarotka wskazała:

while(!(wybor == 'y' || wybor == 'n'))

Cholerka, forma mi spada… :/

0
pentle napisał(a):

Nie wiem dlaczego moja pętla jest nieskonczona nawet jesli wprowadze char kończący warunek. Pomoże ktoś pls?

// ciach
        while (wybor!='y'||'n');
// ciach

Ojej. :)

Przecież 'y'||'n' to jest w C++ true (alternatywa dwóch wartości prawdziwych bo niezerowych), wiec Twój warunek można inaczej zapisać:

        while (wybor!=true);

No a true ma wartość liczbową 1, więc inaczej:

        while (wybor!=1);

No a chyba nigdy nie wciskasz klawisza o kodzie 1, nie? Więc warunek zawsze jest spełniony i pętla jest nieskończona...

2

To nie jest alternatywa 'y' lub 'n'. tylko alternatywa 'wybór != 'y' lub 'n', też jest zawsze prawdziwe (bo zawsze prawdziwe jest 'n'), ale to jednak nie to samo…

Źródło: https://en.cppreference.com/w/cpp/language/operator_precedence

1 użytkowników online, w tym zalogowanych: 0, gości: 1