while循环下的switch...case中的break和continue是怎样

时间:2022-02-09 20:29:41

    /* 4.(****)反复校验用户输入的生日,包括年、月、日。直到年、月、日都合法。
    提示:
        (1)使用while循环实现反复校验
        (2)使用switch实现校验
        (3)只有闰年才有2月29日
        (4)1、3、5、7、8、10、12,每个月有31天
        (5)4、6、9、11,每个月有30天
     */
    // 当时不会做
    int year = 0,month = 0,day = 0;
    //while的条件表达式使用YES,用于一直循环
    while (YES) {
        printf("请输入生日(包含年月日):");
        scanf("%d %d %d",&year,&month,&day);
        
        int daysForFeb = 28;
        if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
            daysForFeb = 29;
        }
        
        switch (month) {
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12: {
                
                if (day >= 1 && day <= 31) {
                    printf("%d-%d-%d是一个合法的生日\n",year,month,day);
                }else{
                    printf("%d-%d-%d不是一个合法的生日,请重新输入生日\n",year,month,day);
                    continue;
                }
                break; // (1)
            }
            case 2: {
                if (day >= 1 && day <= daysForFeb) {
                    printf("%d-%d-%d是一个合法的生日\n",year,month,day);
                }else{
                    printf("%d-%d-%d不是一个合法的生日,请重新输入生日\n",year,month,day);
                    continue;
                }
                break;// (1)
            }
            case 4:
            case 6:
            case 9:
            case 11: {
                if (day >= 1 && day <= 30) {
                    printf("%d-%d-%d是一个合法的生日\n",year,month,day);
                }else{
                    printf("%d-%d-%d不是一个合法的生日,请重新输入生日\n",year,month,day);
                    continue;
                }
                break;// (1)
            }
            default: {
                printf("%d-%d-%d不是一个合法的生日,请重新输入生日\n",year,month,day);
                continue;
                break;// (1)
            }
        }
        
        // 结束循环
        break;//(2)
    }

分析:如果输入的是一个合法的生日,他会利用case中的(1)break跳出switch...case语句,然后再利用后面的代码(2)break结束整个while循环。(1)break不能直接跳出整个while循环。

        如果是输入的是一个不合法的生日,他会利用contiue不再之后其后面的所有代码,switch对continue是透明的,直接进入新一轮的while循环。,
   

continue-break出现在循环中的switch语句中  

以下代码为参考代码例子:
while循环下的switch...case中的break和continue是怎样
 通过单步执行得出以下结论:
1.continue出现在for循环中的switch语句中,switch对continue是透明的,这时直接从continue出现的地方结束本次for循环,重新开始下一轮循环。
2.break出现在for循环中的switch语句中,这时break从switch语句中跳出,进入下一轮for循环,而不是结束整个for循环。可以这样理解:把switch语句看成是循环或者是将循环看做是switch语句,而break跳出的往往是最近的那层循环或者switch语句。
 
扩展:当case语句中出现if判断语句,case语句末出现break且if语句中也出现break语句,那么当执行到if语句中的break语句时,那么将直接跳出switch语句,case语句中出现在if语句后面的代码将不会被执行。
如下代码例子:
while循环下的switch...case中的break和continue是怎样
while循环下的switch...case中的break和continue是怎样
 由于case语句中出现if,且if语句中出现break,所以当执行到if语句时直接跳出switch语句,后面的输出不再执行。
 
没有if语句的代码及输出如下:
while循环下的switch...case中的break和continue是怎样
while循环下的switch...case中的break和continue是怎样