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