C ++错误C2106:'=':左操作数必须是l值

时间:2014-03-23 18:23:29

标签: c++

好吧,所以,忽略我的懒惰编码(这只是为了让程序运行起来,我会在它运行后清理它)。如果我没有得到我想要的输入,我已经设置了几个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值(为什么现在?在我已经使用它之后的最后 - 灾难性的,我会承认。)这可能是我非常明显的事情没有看到因为我是那个编码它的人,或者可能是因为我真的很疯狂如果语句搞砸了某个地方。

有什么想法吗?

5 个答案:

答案 0 :(得分:4)

这是错误:

   year % 4 = 0

您可能打算写==

答案 1 :(得分:0)

=运营商,如

year % 4 = 0

表示分配,而不是比较。因此你的错误。 将其修复为

year % 4 == 0

答案 2 :(得分:0)

你有year % 4 = 0 我认为你有一个错字:你可能想要year % 4 == 0

此外,我更喜欢使用括号来使代码更清晰:

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

答案 3 :(得分:0)

这方面的一个建议是始终将常数放在比较陈述的左侧。它有助于防止逻辑错误。作为示例,请考虑代码

    if year == 0 

并错误地写了:

    if year = 0 

结果将是一个逻辑错误。 而是将常数0放在左侧,这样

     if 0 = year

会在编译时生成语法错误,从而阻止您提交逻辑错误(可能更难调试)

答案 4 :(得分:0)

您的条件中有一个赋值运算符=,而不是比较运算符==

这显然是一个逻辑错误。但是,为什么它是编译器错误?毕竟,C ++允许在条件内进行赋值,并that is something you might legitimately do

在您的情况下,month == 2 && year % 4 = 0将被处理为((month == 2) && (year % 4)) = 0(请参阅C++ Operator Precedence)。在parens中的表达评估为暂时的。但是赋值运算符的左侧必须引用可以写入的存储地址(l-value)。因此,您的代码无效,原因与3 = 3无效的原因相同。 Visual Studio调用此错误C2106