【问题标题】:Error - Control may reach end of non-void function错误 - 控制可能到达非空函数的末尾
【发布时间】:2026-01-15 03:50:02
【问题描述】:
bool isValidDate(int month, int day, int year) {
  if(isLeapYear(year)){
    if(year >= 1752 && month >= 9 && day >= 13){
      if((month == 9 || month == 4 || month == 6 || month == 11) &&     (day <= 30)){
        return true;
      }
      else if((month == 2) && (day <= 29)){
        return true;
      }
      else if(((month >= 1 && month <= 3) || (month >=5 && month <= 8) || month == 10 || month == 12) && (day <= 31)){
        return true;
      }
      else{
        return false;
      }
    }
  }
  else {
    if(year >= 1752 && month >= 9 && day >= 13){
      if((month == 9 || month == 4 || month == 6 || month == 11) && (day <= 30)){
        return true;
      }
      else if((month == 2) && (day <= 28)){
        return true;
      }
      else if(((month >= 1 && month <= 3) || (month >=5 && month <= 8) || month == 10 || month == 12) && (day <= 31)){
        return true;
      }
      else{
        return false;
      }
    }
   }
}

我不明白为什么会出现这样的错误。只有两种可能的路线,所以这意味着肯定会有一个返回值。我很困惑。请帮忙!

【问题讨论】:

  • 我闻到了格式问题。请注意问题编辑!

标签: c++


【解决方案1】:

有一种可能的路由不调用返回。如果if(year &gt;= 1752 &amp;&amp; month &gt;= 9 &amp;&amp; day &gt;= 13) 没有评估为真。

else{
    if(year >= 1752 && month >= 9 && day >= 13){
        if((month == 9 || month == 4 || month == 6 || month == 11) && (day <= 30)){
            return true;
        }
        else if((month == 2) && (day <= 28)){
            return true;
        }
        else if(((month >= 1 && month <= 3) || (month >=5 && month <= 8) || month == 10 || month == 12) && (day <= 31)){
            return true;
        }
        else{
            return false;
        }
    }
    // return here
}

【讨论】:

  • 两条路线:第一个if块也存在同样的问题。
【解决方案2】:

如果满足以下条件,则没有“其他”:

if(year >= 1752 && month >= 9 && day >= 13){

【讨论】:

    【解决方案3】:

    如果(year &gt;= 1752 &amp;&amp; month &gt;= 9 &amp;&amp; day &gt;= 13)false,则函数末尾没有return

    请注意,上述if 可能与您预期的不同。可能您只想将 1752 年 9 月 13 日之后的日期视为有效。但它会将 9 月之前的任何日期视为无效。你可能想在函数开头:

    if (year < 1752)
        return false;
    else if (year == 1752) {
        if (month < 9 || (month == 9 && day < 13))
            return false;
    }
    

    顺便说一句,您不必为闰年和非闰年复制所有块。仅当month == 2 时才能检查isLeapYear()

    【讨论】:

      最近更新 更多