Цикл while в c++

При запуске программы, какую бы букву я не ввел, все равно пишется мой баланс! p.s. Новичок в этом деле, если не затруднит, объясните по подробнее.

#include<iostream>
#include<array>
using namespace std;

int main()
{
    setlocale(LC_ALL, "Rus");
    const int inv = 10;
    string inventory[inv];
    string answer;
    int balance = 1500;
    int health = 500;
    int power = 200;
    int invisibility = 650;

    

    cout << "Зелье лечения - 500$\n";
    cout << "Зелье силы - 200$\n";
    cout << "Зелье невидимости - 650$\n";
    cout << "Баланс - b | Цена зелий - p | Инвентарь - i | Выйти - e\n";
    cout << "Зелье лечения - health | Зелье силы - power | Зелье невидимости - invisibility\n";


    while (answer != "E" || "e")
    {
        cout << "\n";
        cin >> answer;
        if (answer == "b" or "B")
        {
            cout << "Ваш баланс - " << balance << " $";
        }
        else if (answer == "p" || "P")
        {
            cout << "Зелье лечения - 500$\n";
            cout << "Зелье силы - 200$\n";
            cout << "Зелье невидимости - 650$\n";
        }
        else if (answer == "health")
        {
            balance = balance - health;
            for (int i = 1; i < inv; i++)
            {
                if (inventory[i] == "")
                {
                    inventory[i] = "health";
                }
            }
        }
        else if (answer == "power")
        {
            balance = balance - power;
            for (int i = 1; i < inv; i++)
            {
                if (inventory[i] == "")
                {
                    inventory[i] = "power";
                }
            }
        }
        else if (answer == "invisibility")
        {
            balance = balance - invisibility;
            for (int i = 1; i < inv; i++)
            {
                if (inventory[i] == "")
                {
                    inventory[i] = "invisibility";
                }
            }

        }
        else if (answer == "i" || "I")
        {
            cout << "Ваш инвентарь: ";
            for (int i = 1; i < inv; i++)
            {
                if (inventory[i] != "")
                    cout << inventory[i] << "\n";
            }
        }
    } 
        return 0;

}

Ответы (1 шт):

Автор решения: AlexGlebe

В логическом операторе ИЛИ or || нет механизма догадываться, что вы хотите. Он сравнивает первый аргумент, и если тот даёт ложь, то проверяется второй. И так далее. До первого правдивого результата.

Команды if ( x != a || b ) == if ( ( x != a ) || b ) рассматриваются как сравнение x с a и если они равны то проверку на истинность b.

А строка "e" как логическое значение подразумевает истину.

Первый случай надо писать так :

while ( ( answer != "E" ) and ( answer != "e" ) )

Что ответ НЕ равен "E" И НЕ равен "e". Внимательно надо с логикой.

Второй случай :

if (answer == "b" or answer == "B")

Что ответ равен "b" ИЛИ равен "B". Внимательно надо с логикой ещё раз.


Оператор И and && вычисляется так : последовательно проверяется на позитивность (в логическом смысле) всех аргументов, и если один из них негативный (в логическом смысле) то просмотр аргументов останавливается и результат будет негативный (в логическом смысле).

В языке Си числа в логическом смысле переводятся как НЕ равно нулю. Число один 1 - это ПРАВДА ; ноль 0 - это ЛОЖЬ ; минус один -1 - это ПРАВДА.

→ Ссылка