Итак, у меня есть вопрос о 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";
?
В дополнение к ответу Джрока, проблема, с которой вы сталкиваетесь, заключается в том, что вы предполагать что строчные и прописные символы — это одно и то же. Они есть НЕ. ‘y’ и ‘Y’ — два разных символа. То же самое для «n» и «N».
Ты пишешь:
Если введено «n» => N — это НЕ Y, что ПРАВИЛЬНО, поэтому bool
правда => 1
Нет. «N» — это не «y».
Если введено «y» => Y — это НЕ Y, что НЕПРАВИЛЬНО, поэтому fasle => 0
Это правильно. «у» — это не «у».
Попробуйте это вместо этого:
bool Overdue = (yn != 'n') && (yn != 'N');
Причиной неожиданного поведения является то, что вы сравниваете char
со строковым литералом "y"
, Строковые литералы имеют тип const char[n]
где n
длина литерала, включая завершающий символ NUL.
Вместо этого сравните с символьным литералом:
yn != 'y'
Когда вы говорите это: yn != "y"
, символ получает повышение int
и строковый литерал распадается на const char*
, Как это должно себя вести, не определено стандартом.
Результат выражения сохраняется в bool Overdue
, когда yn
держит 'n'
выражение true
(‘n’ действительно отличается от ‘y’), поэтому true
будет храниться и наоборот).