Здравствуйте! Я пытаюсь создать программу, которая читает серию выражений инфикса из файла, пока не достигнет точки с запятой или точки (A + B.), А затем вывести постфикс выражения в другой файл. У меня проблемы с тем, чтобы мои перегруженные операторы работали правильно. Кто-нибудь может дать мне несколько советов о том, что с ними не так?
std::istream& operator>>(std::istream& in, expression& x) {
char y;
do {
in >> y;
x.ifix += y;
if (y == '.') {
x.last = true;
}
} while (y!= ';' || y!= '.');
x.convertToPostfix();
return in;
}
std::ostream& operator<<(std::ostream& out, const expression& x) {
out << x.pfix;
return out;
}
Это выражение ВСЕГДА верно:
while (y != ';' || y != '.');
Если y
является ';'
, затем y
не может быть '.'
так что вторая половина верна. То же самое, но наоборот y
является '.'
,
Ты хочешь
while (y != ';' && y != '.');
Или, если вы хотите выразить это больше как человек:
while (!(y == ';' || y == '.'));
Другими словами, «делайте вещи, пока y не равен точке с запятой или точке».
Это очень распространенная ошибка при объединении условий, и стоит потратить некоторое время на то, чтобы разобраться, чтобы вы могли заметить ее в будущем — потому что вы БУДЕТЕ совершить эту ошибку снова, я гарантирую это.
class expression
{
...
friend std::istream& operator>>(std::istream& in, expression& x);
friend std::ostream& operator<<(std::ostream& out, const expression& x);
};
std::istream& operator>>(std::istream& in, expression& x) {
char y;
do {
in >> y;
x.ifix += y;
if (y == '.') {
x.last = true;
}
} while (y!= ';' && y!= '.'); // you meant && here, right?
x.convertToPostfix();
return in;
}
std::ostream& operator<<(std::ostream& out, const expression& x) {
out << x.pfix;
return out;
}