一个坑
switch有一个坑比较容易踩,在这里记录提醒自己。
如下代码请问输出什么?
如果你觉得答案是:
i:2那就错了。
答案其实是:
要注意,switch语句到case语句之间的代码是不会执行的。
直接略过,所以case挨着switch写好了:)
妙用
switch语句通常我们惯性思维case都是从下到大1-N种情况排列下来,
不过不要忘记case是可以倒着从大往小写的。
如,求某日期是该年的第几天可以从12月倒着往下写:
int getDaysInYear1(int year,int month,int day)
{
int sum_days = 0;
int small = 30, big = 31, leap_two = 29, not_leap_two = 28;
bool is_leap_year = false;
((year%4==0 && year%100!=0)||(year%100==0&&year%400==0))?is_leap_year = true:is_leap_year = false;
switch (month)
{
case 12: sum_days+=30;
case 11: sum_days+= 31;
case 10: sum_days+=30;
case 9: sum_days += 31;
case 8: sum_days += 31;
case 7: sum_days += 30;
case 6: sum_days +=31;
case 5: sum_days +=30;
case 4: sum_days += 31;
case 3:
if (is_leap_year)
sum_days+= 29;
else
sum_days+= 28;
case 2: sum_days+= 31;
case 1: sum_days+=day;
default:
break;
}
return sum_days;
}
这样写比顺着从小往大写可以减少很多if判断。
当然,用数组映射月份日期更简洁:
int getDaysInYear2(int year ,int month,int day)
{
int sum_days = 0;
int i ;
int months[] ={31,28,31,30,31,30,31,31,30,31,30,31};
for ( i = 0; i < month-1; i++)
{
sum_days += months[i];
}
sum_days += day;
((year%4==0 && year%100!=0)||(year%100==0&&year%400==0))?sum_days++ :sum_days;
return sum_days;
}