我想这更像是假设而不是实际,但我想知道是否可以使用在'assert'中返回'true'或'false'的switch语句。 我意识到有更好的方法可以做到这一点,但我想从错误处理方面来看待这个问题,而不是消除用户输入。
例如,考虑一个Date类,它接受输入设置日期。在类的SetDate()成员函数中,我想放置一个'assert'来处理由输入引起的错误,例如本月的“13”或月份“2”(2月)的30天。编写一个执行此操作的switch语句将是微不足道的:
switch(nMonth){
case 1:
case 3:(etc)
if(nDay>=1 && nDay <=31)
return true;
else
return false;
(etc)
default:
return false;
}
假设switch语句按预期工作,我需要做些什么才能使它在'assert'错误处理方案中工作?我按原样尝试了,但(不出意外)它没有编译。
编辑: @Yu Hao: 这就是我修复它的方式。我使用了bool函数。
bool TestDate(int nMonth, int nDay, int nYear){
switch(nMonth){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
if(nDay >=1 && nDay <=31)
return true;
break;
case 4:
case 6:
case 9:
case 11:
if(nDay >=1 && nDay <=30)
return true;
break;
case 2:
if((nYear % 400 == 0) || ((nYear % 100 !=0) &&(nYear % 4 == 0))){
if(nDay >=1 && nDay <=29)
return true;}
else if(nDay >=1 && nDay <=28)
return true;
else
return false;
break;
default:
return false;
}
return 0;
}
Date(int nMonth = 1, int nDay = 1, int nYear = 1970){
assert(TestDate(nMonth,nDay,nYear));
m_nMonth = nMonth;
m_nDay = nDay;
m_nYear = nYear;
}
答案 0 :(得分:2)
switch
语句没有返回值,return false
语句中的switch
或此类语句适用于它们所在的函数。所以你可以在switch
内使用assert
,但您可以将switch
语句放在assert
内的函数。
答案 1 :(得分:0)
您无法在switch
内使用assert
。 assert
表达了。 switch
是一个陈述,而不是表达。
你可以做的是使用三元运算符。如果您的switch
声明很大,那就不太好了。
assert (((nMonth==1) || (nMonth == 3) || (nMonth == 5) || …) ?
((nDay >= 1) && (nDay <= 31) :
(nMonth==2) ? ((nDay >= 1) && (nDay <= 28) :
…);