switch分支语句break的作用

请问我这个判断哪一年那一个月有几天的代码,如果不在case后加break,为什么输入2004 2,会出现2月是30天的情况呢

#includeh>
int main()
{
    int year,mouth,day,i;
    i=(year%4==0&&year%100!=0)||(year%400==0);
    printf("输入年和月\n");
    scanf("%d%d",&year,&mouth);
    if(year<0||mouth<0||mouth>12)
    {
        printf("输入有误\n");
    }
    switch(mouth)
    {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:day=31;
        case 2:day=28+i;
        case 4:
        case 6:
        case 9:
        case 11:day=30;
    }
    printf("%d年%d月一共有%d天\n",year,mouth,day);
    return 0;
}


没有break的话,代码会从匹配的case语句开始一直往下运行,直到所有case都执行完

不加break会穿越到下面的case
1 3 5 7 8 10 12,这里你期望它穿越,不必每个都写了
但是12和2之间,你不能穿越,否则12那个会继续执行下面的,不再是31了

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7549043
  • 这篇博客也不错, 你可以看下C语言switch-case语句中的break
  • 除此之外, 这篇博客: 分支语句和循环语句中的  switch语句中的break 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支,执行完某个case语句后,我们一般采用break语句跳出switch达到分支的作用。
    假如我们需要输出一个星期的某一天时,可采用switch语句,如下:
    int main()
    {
        int day = 0;
        scanf("%d",&day);
        switch(day)
       {
            case 1:
                printf("星期一\n");
                break;
            case 2:
                printf("星期二\n");
                break;
            case 3:
                printf("星期三\n");
                break;    
            case 4:
                printf("星期四\n");
                break;    
            case 5:
                printf("星期五\n");
                break;
            case 6:
                printf("星期六\n");
                break;
            case 7:
                printf("星期天\n");    
                break;
       }
        return 0;
     }
    

     有时候我们的需求变了:

    1. 输入1-5,输出的是“weekday”;
    2. 输入6-7,输出“weekend”
    所以我们的代码就应该这样实现了:
    int main()
    {
        int day = 0;
        scanf("%d", &day);
        switch(day)
       {
            case 1:
            case 2:
            case 3:
            case 4:
            case 5:
                printf("weekday\n");
                break;
            case 6:
            case 7:
                printf("weekend\n");
                break;
       }
        return 0; 
    }

     编程好习惯

    在最后一个 case 语句的后面加上一条 break语句。
    (之所以这么写是可以避免出现在以前的最后一个 case 语句后面忘了添加 break语句)。