Switch语句的一个坑 & 一个妙用

一个坑

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值