Ошибка C ++ C2106: ‘=’: левый операнд должен иметь значение l

Хорошо, так что, игнорируя мое ленивое кодирование (это просто для того, чтобы заставить программу работать, я уберу ее после того, как она заработает). Я настроил пару операторов if, которые будут генерировать исключения, если я не получу желаемый ввод.

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

int main()
{

bool flag = false;
int month, day, year;
void header();

class monthClassException
{
public:
monthClassException()
{
message = "Invalid Month";
}
monthClassException(string str)
{
message = str;
}
string what()
{
return message;
}

private:
string message;
};
class dayClassException
{
};
class yearClassException
{
};header();

do
{
try
{
cout << "Please enter your date of birth (MM-DD-YYYY): " << endl;
cin >> month;

cin.ignore(10,'-');
cin >> day;

cin.ignore(10,'-');
cin >> year;if (month > 12 || month < 1)
throw monthClassException("Invalid Month Entry");

if( ((month == 4 || month == 6 || month == 9 || month == 11) && day > 30) || day < 1)
throw dayClassException();

else if ( ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12 ) && day > 31) || day < 1)
throw dayClassException();

else if (month == 2 && year % 4 != 0 && day > 28)
throw dayClassException();

else if((month == 2 && year % 4 = 0) && day > 29)
throw dayClassException();
}
catch(monthClassException mCEO)
{
cout << mCEO.what() << endl;
system("pause");
}
catch(dayClassException)
{
cout << "Invalid Day Entered for Selected Month" << endl;
system("pause");
}
catch(yearClassException yCEO)
{
}
}while(!flag);return 0;
}

Я получаю свою ошибку в этом последнем исключении:

            else if((month == 2 && year % 4 = 0) && day > 29)
throw dayClassException();

он говорит, что месяц — недопустимое l-значение (почему сейчас? В самом конце, после того, как я его уже использовал — катастрофически, я признаю.) Это может быть чем-то действительно очевидным, что я не вижу, потому что я один кто это закодировал, или это может быть потому, что я действительно сумасшедший, если заявления где-то напутали.

Есть идеи?

-3

Решение

Вот ошибка:

   year % 4 = 0

ты наверное хотел написать ==

4

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

= оператор как в

year % 4 = 0

означает назначение, а не сравнение. Отсюда твоя ошибка.
Исправить это

year % 4 == 0
0

У тебя есть year % 4 = 0,
Я думаю, что у вас есть опечатка: вы можете хотеть year % 4 == 0,

Кроме того, я предпочитаю использовать скобки, чтобы сделать код более понятным:

...
else if ((month == 2) && (year % 4 == 0) && (day > 29)) {
throw dayClassException();
}
0

У вас есть оператор присваивания = в вашем состоянии вместо оператора сравнения ==,

Это довольно ясно логическая ошибка. Тем не менее, почему это компилятор ошибка? В конце концов, C ++ позволяет присваивать внутри условия, и это то, что вы могли бы законно делать.

В твоем случае, month == 2 && year % 4 = 0 обрабатывается как ((month == 2) && (year % 4)) = 0 (увидеть Приоритет оператора C ++). Это выражение в скобках оценивается как временное. Но левая часть оператора присваивания должна ссылаться на адрес памяти, на который вы можете записать ( л-значение). Таким образом, ваш код недействителен по той же причине, что 3 = 3 является недействительным. Visual Studio вызывает эту ошибку C2106.

0

В связи с этим предлагается всегда указывать константу в левой части оператора сравнения. Это помогает предотвратить логические ошибки. В качестве примера рассмотрим код

    if year == 0

и по ошибке вы написали:

    if year = 0

результат был бы логической ошибкой.
Вместо этого поместите постоянную 0 на левой стороне, так что

     if 0 = year

будет генерировать синтаксическую ошибку при компиляции, что не позволит вам совершить логическую ошибку (что может быть сложнее отладить)

0
По вопросам рекламы [email protected]