我具有检查日期是否在范围内的此功能。

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/

10-11 21:25