我具有检查日期是否在范围内的此功能。
bool check_date(const int &in_day, const int &in_month, const int &in_year)
{
if (in_year < 1582)
return false;
else if (in_year == 1582 && in_month < october)
return false;
else if (in_month < 1 || in_month > 12)
return false;
switch (in_month)
{
case january: // 31 days
if (in_day < 1 || in_day > 31)
return false;
break;
case february: // 28 days, 29 if leap.
if (is_leap(in_year))
{
if (in_day > 29 || in_day < 1)
return false;
}
else
{
if (in_day > 28 || in_day < 1)
return false;
}
case march: // 31 days
if (in_day < 1 || in_day > 31)
return false;
break;
case april: // 30 days
if (in_day < 1 || in_day > 30)
return false;
break;
case may: // 31 days
if (in_day < 1 || in_day > 31)
return false;
break;
case june: // 30 days
if (in_day < 1 || in_day > 30)
return false;
break;
case july: // 31 days
if (in_day < 1 || in_day > 31)
return false;
break;
case august: // 31 days
if (in_day < 1 || in_day > 31)
return false;
break;
case september: // 30 days
if (in_day < 1 || in_day > 30)
return false;
break;
case october: // 31 days
if (in_day < 1 || in_day > 31)
return false;
break;
case november: // 30 days
if (in_day < 1 || in_day > 30)
return false;
break;
case december: // 31 days
if (in_day < 1 || in_day > 31)
return false;
break;
default:
std::cout <<"CORRECT DATE";
}
return true;
}
虽然代码按其应有的方式工作,但在正确的位置返回true和false,但即使日期正确(例如,在
default:
位置),也不会选择in_day = 17, in_month = 9, in_year = 1999
大小写。最初,我在默认情况下使用了return true;
,但是它永远不会返回true,在运行调试器之后,我发现默认情况下再也没有运行过,因此我将return
从switch语句中移出了(它可以在那儿工作)。我在做错什么,为什么默认情况不执行? 最佳答案
这是无法访问的代码。default
中的switch (in_month)
等于
if (in_month < 1 || in_month > 12) return false;
因此,如果要在
default
中使用switch (in_month)
,则不需要if (in_month < 1 || in_month > 12)
,请参见: switch (in_month) {
default: // if (in_month < 1 || in_month > 12)
std::cout << "BAD month: ";
return false;
请参阅以下经过优化的和清除的代码:
#include <iostream>
using namespace std;
enum {
january = 1,
february,
march,
april,
may,
june,
july,
august,
september,
october,
november,
december
};
bool is_leap(const int year) {
if (year % 400 == 0)
return true;
if (year % 100 == 0)
return false;
if (year % 4 == 0)
return true;
return false;
}
bool check_date(const int in_day, const int in_month, const int in_year) {
if (in_year < 1582)
return false;
if (in_year == 1582 && in_month < october)
return false;
switch (in_month) {
default: // if (in_month < 1 || in_month > 12)
std::cout << "BAD DATE: ";
return false;
case january: // 31 days
if (in_day < 1 || in_day > 31)
return false;
break;
case february: // 28 days, 29 if leap.
if (is_leap(in_year)) {
if (in_day > 29 || in_day < 1)
return false;
} else {
if (in_day > 28 || in_day < 1)
return false;
}
break;
case march: // 31 days
if (in_day < 1 || in_day > 31)
return false;
break;
case april: // 30 days
if (in_day < 1 || in_day > 30)
return false;
break;
case may: // 31 days
if (in_day < 1 || in_day > 31)
return false;
break;
case june: // 30 days
if (in_day < 1 || in_day > 30)
return false;
break;
case july: // 31 days
if (in_day < 1 || in_day > 31)
return false;
break;
case august: // 31 days
if (in_day < 1 || in_day > 31)
return false;
break;
case september: // 30 days
if (in_day < 1 || in_day > 30)
return false;
break;
case october: // 31 days
if (in_day < 1 || in_day > 31)
return false;
break;
case november: // 30 days
if (in_day < 1 || in_day > 30)
return false;
break;
case december: // 31 days
if (in_day < 1 || in_day > 31)
return false;
break;
}
std::cout << " CORRECT DATE: ";
return true;
}
int main() {
cout << check_date(0, 0, 2017) << endl; // 0
cout << check_date(29, 2, 2000) << endl; // 1
cout << check_date(29, 2, 2017) << endl; // 0
cout << check_date(1, 1, 2017) << endl;
cout << check_date(1, 1, 2017) << endl;
cout << check_date(1, 1, 2017) << endl;
}
输出:
BAD month: 0
CORRECT DATE: 1
0
CORRECT DATE: 1
CORRECT DATE: 1
CORRECT DATE: 1
关于c++ - 默认情况不执行C++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45892622/