switch case:C和C ++中的切换案例

切换声明

if-thenif-then-else语句不同,该switch语句可以有许多可能的执行路径。一个switch作品用byteshortchar,和int原始数据类型。它还可以与枚举类型(讨论 枚举类型)的 String类,以及一些特殊的类来封装某些基本类型: Character, Byte, Short,和 Integer(在讨论 数字和字符串)。

下面的代码示例 SwitchDemo声明了一个int名称,month其值代表一个月。该代码month使用该switch语句根据值显示月份的名称。


公共类SwitchDemo {
    public static void main(String [] args){

        int month = 8;
        String monthString;
        开关(月){
            case 1:monthString =“January”;
                     打破;
            案例2:monthString =“二月”;
                     打破;
            案例3:monthString =“March”;
                     打破;
            案例4:monthString =“April”;
                     打破;
            case 5:monthString =“May”;
                     打破;
            案例6:monthString =“June”;
                     打破;
            case 7:monthString =“July”;
                     打破;
            case 8:monthString =“August”;
                     打破;
            案例9:monthString =“九月”;
                     打破;
            case 10:monthString =“October”;
                     打破;
            case 11:monthString =“November”;
                     打破;
            case 12:monthString =“December”;
                     打破;
            默认值:monthString =“无效月份”;
                     打破;
        }
        的System.out.println(monthString);
    }
}

在这种情况下,August打印到标准输出。

switch声明的主体称为开关块。在声明switch块可以与一个或多个标记casedefault标签。该switch语句计算其表达式,然后执行匹配case标签后面的所有语句。

您还可以使用if-then-else语句显示月份的名称:

int month = 8;
if(month == 1){
    的System.out.println( “一月”);
} else if(month == 2){
    的System.out.println( “二月”);
}
... // 等等

决定是使用if-then-else语句还是switch语句是基于可读性和语句正在测试的表达式。一个if-then-else语句可以测试基于值或条件的范围的表达式,而switch语句测试仅基于一个整数,枚举值或表达式String对象。

另一个兴趣点是break声明。每个break语句都终止了封闭switch语句。控制流继续执行switch块后面的第一个语句。该break声明是必要的,因为没有他们,在报表switch告吹:匹配后,所有报表case标签中,依次执行,无论后续的表达case标签,直到break遇到声明。该程序 SwitchDemoFallThrough显示了一个switch块中的语句。程序显示与整数相对应的月份month和年份中的月份:


公共类SwitchDemoFallThrough {

    public static void main(String [] args){
        java.util.ArrayList <String> futureMonths =
            new java.util.ArrayList <String>();

        int month = 8;

        开关(月){
            案例1:futureMonths.add(“January”);
            案例2:futureMonths.add(“二月”);
            案例3:futureMonths.add(“March”);
            案例4:futureMonths.add(“四月”);
            案例5:futureMonths.add(“May”);
            案例6:futureMonths.add(“六月”);
            案例7:futureMonths.add(“七月”);
            案例8:futureMonths.add(“八月”);
            案例9:futureMonths.add(“九月”);
            案例10:futureMonths.add(“十月”);
            案例11:futureMonths.add(“十一月”);
            案例12:futureMonths.add(“12月”);
                     打破;
            默认值:break;
        }

        if(futureMonths.isEmpty()){
            System.out.println(“无效的月号”);
        } else {
            for(String monthName:futureMonths){
               的System.out.println(MONTHNAME);
            }
        }
    }
}

这是代码的输出:

八月
九月
十月
十一月
十二月

从技术上讲,最终break不是必需的,因为流量超出了switch声明范围。break建议使用a ,以便更容易修改代码并减少错误。该default部分处理其中一个case部分未明确处理的所有值。

以下代码示例 SwitchDemo2显示了语句如何具有多个case标签。代码示例计算特定月份的天数:


class SwitchDemo2 {
    public static void main(String [] args){

        int month = 2;
        int year = 2000;
        int numDays = 0;

        开关(月){
            案例1:案例3:案例5:
            案例7:案例8:案例10:
            案例12:
                numDays = 31;
                打破;
            案例4:案例6:
            案例9:案例11:
                numDays = 30;
                打破;
            案例2:
                if(((年%4 == 0)&& 
                     !(年%100 == 0))
                     || (年%400 == 0))
                    numDays = 29;
                其他
                    numDays = 28;
                打破;
            默认:
                System.out.println(“无效的月份。”);
                打破;
        }
        System.out.println(“天数=”
                           + numDays);
    }
}

这是代码的输出:

天数= 29

在交换机语句中使用字符串

在Java SE 7及更高版本中,您可以Stringswitch语句的表达式中使用对象。以下代码示例 StringSwitchDemo显示基于String命名值的月份编号month


public class StringSwitchDemo {

    public static int getMonthNumber(String month){

        int monthNumber = 0;

        if(month == null){
            return monthNumber;
        }

        switch(month.toLowerCase()){
            案例“一月”:
                monthNumber = 1;
                打破;
            案例“二月”:
                monthNumber = 2;
                打破;
            案例“游行”:
                monthNumber = 3;
                打破;
            案例“四月”:
                monthNumber = 4;
                打破;
            案件“可能”:
                monthNumber = 5;
                打破;
            案例“六月”:
                monthNumber = 6;
                打破;
            案件“七月”:
                monthNumber = 7;
                打破;
            案例“八月”:
                monthNumber = 8;
                打破;
            案例“九月”:
                monthNumber = 9;
                打破;
            案例“十月”:
                monthNumber = 10;
                打破;
            案例“十一月”:
                monthNumber = 11;
                打破;
            案例“十二月”:
                monthNumber = 12;
                打破;
            默认: 
                monthNumber = 0;
                打破;
        }

        return monthNumber;
    }

    public static void main(String [] args){

        String month =“August”;

        int returnedMonthNumber =
            StringSwitchDemo.getMonthNumber(月);

        if(returnedMonthNumber == 0){
            System.out.println(“无效月份”);
        } else {
            的System.out.println(returnedMonthNumber);
        }
    }
}

这段代码的输出是8

将表达式中的表达式与每个标签关联Stringswitch表达式进行比较,case就像使用该 String.equals方法一样。为了使StringSwitchDemo示例无论大小写都接受任何月份,month将转换为小写(使用 toLowerCase方法),并且与case标签关联的所有字符串都是小写的。

注意:此示例检查switch语句中的表达式是否为null。确保任何switch语句中的表达式不为null以防止NullPointerException抛出该表达式。