Bool переменная. Логика чека

Итак, у меня есть вопрос о bool переменные.

Это программа, которая проверяет, выплачена ли задолженность вовремя, а если нет, то она умножается на 1.10.

#include <iostream>
using namespace std;
int main()
{
float Dues;
cout<<"Enter ammount: \n";
cin>>Dues;
cout<<"On time? (y/n)";
char yn;
cin>>yn;
bool Overdue = yn !="y"; //TRUE (1) if it is late, FALSE (0) if it is on time
float AmountDue;
AmountDue = Overdue ? Dues*1.10 : Dues;
cout<<"Ammount due: ";
cout<<<<AmountDue;
return 0;

}

Я не понимаю логику бул

У нас есть

bool Overdue = yn !="y";

Теперь это мое понимание логики bool, и это Не правильно

Если введено «n» => N — это НЕ Y, что ПРАВИЛЬНО, поэтому bool имеет значение true => 1

Если введено «y» => Y — это НЕ Y, что НЕПРАВИЛЬНО, поэтому fasle => 0

Но на самом деле все наоборот, и я не могу объяснить это логически самому себе.
На чем основана логика bool Overdue = yn !="y"; ?

1

Решение

В дополнение к ответу Джрока, проблема, с которой вы сталкиваетесь, заключается в том, что вы предполагать что строчные и прописные символы — это одно и то же. Они есть НЕ. ‘y’ и ‘Y’ — два разных символа. То же самое для «n» и «N».

Ты пишешь:

Если введено «n» => N — это НЕ Y, что ПРАВИЛЬНО, поэтому bool
правда => 1

Нет. «N» — это не «y».

Если введено «y» => Y — это НЕ Y, что НЕПРАВИЛЬНО, поэтому fasle => 0

Это правильно. «у» — это не «у».

Попробуйте это вместо этого:

bool Overdue = (yn != 'n') && (yn != 'N');
2

Другие решения

Причиной неожиданного поведения является то, что вы сравниваете char со строковым литералом "y", Строковые литералы имеют тип const char[n] где n длина литерала, включая завершающий символ NUL.

Вместо этого сравните с символьным литералом:

yn != 'y'

Когда вы говорите это: yn != "y", символ получает повышение int и строковый литерал распадается на const char*, Как это должно себя вести, не определено стандартом.

Результат выражения сохраняется в bool Overdue, когда yn держит 'n'выражение true (‘n’ действительно отличается от ‘y’), поэтому true будет храниться и наоборот).

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector