/ /エラー - 制御が非void関数の終わりに達する可能性があります - c ++

エラー - コントロールは非void関数の終わりに達することがあります - c ++

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;
}
}
}
}

私はなぜこのようなエラーが出るのかを知ることはできません。ルートが2つしかない可能性があるので、戻り値が間違いないことを意味します。助けてください!

回答:

回答№1は1

戻り値がない場合は、可能なルートが1つあります。 if(year >= 1752 && month >= 9 && day >= 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
}

回答№2の場合は1

次の場合にはこれには「else」はありません:

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

回答№3の場合は1

ない return 関数の最後にif (year >= 1752 && month >= 9 && day >= 13)false.

なお、上記 if あなたが期待どおりに動作しない場合があります。おそらく、あなたは1752年9月13日以降有効な日付として扱いたいと思っています。しかし、9月より前の日付は有効ではないとみなします。あなたは関数の始めにしたいかもしれません:

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

ところで、うるう年とうるう年のすべてのブロックを複製する必要はありません。チェック isLeapYear() もしも month == 2