3.5 switch语句

如果要根据一个值(数字或者字符)来判定应该执行哪条分支,不需要判断什么条件,这个时候,用switch语句更合适。switch语法如下:
switch(表达式){
    case a:…;
    break;
    case b:…;
    break;
    /*
    其他代码
     */
    default:…;
}
(1)switch需要大括号,不能省略;
(2)switch里面不是条件,是表达式,可以计算出值,这里只接受算术表达式、字符表达式或字符串;
(3)case后的常量(a、b)的类型和表达式的类型一致,这里执行多条语句不需要大括号;
(4)不允许两个case有相同的值;
(5)在case后面紧接着的是冒号,如果冒号后面没有任何语句,那么就执行紧接着的下一个case语句,直到遇到break;如果要形成多路逻辑,那么每个case语句最后都要写上break。
如果不写会怎样呢?我们用代码来说明,下面代码中,如果a是4,那么执行完case 4的语句后,就执行case 5;执行完case 5的语句后,就执行case 6,到这里打印出a,遇到了break,整个switch结束。没有break的case语句执行完,会继续执行下一条case,直到遇到break或者结束,不管后面的case有没有命中!
switch(a){
    case 4:语句;
    case 5:语句;
    case 6:System.out.println(a);
    break;
}
(6)default是缺省,如果没有任何一个case命中,那么就直接执行default里面的代码。default不是必须的,可以没有。
下面来看一个具体的例子,运行一下看看什么效果:
public static void main(String[]args){
    System.out.println("请输入一个0到6的整数。");
    int a=new java.util.Scanner(System.in).nextInt();
    switch(a){
        case 0:System.out.println("Sunday");
        break;
        case 1:System.out.println("Monday");
        break;
        case 2:System.out.println("Tuesday");
        break;
        case 3:System.out.println("Wednesday");
        break;
        case 4:System.out.println("Thursday");
        break;
        case 5:System.out.println("Friday");
        break;
        case 6:System.out.println("Saturday");
        break;
        default:System.out.println("wrong number!");
    }
}

练习题

  • 根据上面的switch规范进行选择,以下题目的a是整数类型
    1.下列说法正确的是 (2分) [选择]
    A.
    B. switch必定是要大括号
    C. 缺乏default语句
    D. case后的常量的类型,没有和switch的表达式类型一致
    E. 语法正确
    switch(a)case 5:System.out.println(a);break;case 6:System.out.println(a);
    
    2.下列说法正确的是 (2分) [选择]
    A.
    B. 不允许两个case有相同的值
    C. 缺乏default语句
    D. case后的常量的类型,没有和switch的表达式类型一致
    E. 语法正确
    switch(a){    case 5:System.out.println(a);    case 5:System.out.println(a);}
    
    3.下列说法正确的是 (2分) [选择]
    A.
    B. case不允许跳过前面的项目,case 4那些也需要
    C. switch里面应该是条件
    D. case 5和default后缺乏大括号
    E. 语法正确
    switch(a){
            case 5:System.out.println(a);
            break;
            default:System.out.println("无匹配");}
    
    4.下列说法正确的是 (2分) [选择]
    A.
    B. case冒号后缺乏大括号
    C. case没有写break
    D. case是一个布尔表达式,和a的类型不匹配
    E. 语法正确
    switch(a){
            case a<5:System.out.println("小于5");
            case a >= 5:System.out.println("大于5");
            default:System.out.println("无匹配");}
    
    5.下列说法正确的是 (2分) [选择]
    A.
    B. case冒号后缺乏大括号
    C. case 4和case 6里不能使用了"4"和"6",应该用4和6
    D. case 6后面没有break
    E. 语法正确
    switch(a){
            case 4:System.out.println("4");
            break;
            case 6:System.out.println("6");
            default:System.out.println("无匹配");}
    
    6.下列说法正确的是 (2分) [选择]
    A.
    B. 不允许两个case有相同的语句
    C. default最后缺乏break
    D. case后的常量的类型,没有和switch的表达式类型一致
    E. 语法正确
    switch(a){
            case "4":System.out.println("4");
            break;
            case "5":System.out.println("4");
            break;
            default:System.out.println("无匹配");}
    
    7.下列说法正确的是 (2分) [选择]
    A.
    B. 不允许两个case有相同的值
    C. switch不允许用表达式
    D. default最后没有使用break
    E. 语法正确
    switch(a+2){
            case 6:System.out.println("6");
            break;
            case 7:System.out.println("7");
            break;
            case 8:System.out.println("8");
            break;
            default:System.out.println("无匹配");}
    
  • 阅读
    1.switch的局限性 [阅读]
    switch可以用来做分支结构,但仅限于单个值的对比,如果用它来完成成绩分级,那么就会显得“笨拙”。阅读下面的代码,注意它利用了命中case后逐次往下执行直到遇到break的特性
    public static void main(String[]agers){    int score=new Scanner(System.in).nextInt();    switch(score){        case 100:;        case 99:;        case 98:;        case 97:;        case 96:;        case 95:;        case 94:;        case 93:;        case 92:;        case 91:;        case 90:System.out.println("优");        break;        case 89:;        case 88:;        case 87:;        case 86:;        case 85:;        case 84:;        case 83:;        case 82:;        case 81:;        case 80:System.out.println("良");        break;        case 79:;        case 78:;        case 77:;        case 76:;        case 75:;        case 74:;        case 73:;        case 72:;        case 71:;        case 70:System.out.println("中");        break;        case 69:;        case 68:;        case 67:;        case 66:;        case 65:;        case 64:;        case 63:;        case 62:;        case 61:;        case 60:System.out.println("及格");        break;        default:if(score > 30)            System.out.println("不及格");        else             System.out.println("差");            }}
    
    2.swtich用字符串作为分支依据 [阅读]
    java 1.8后支持使用字符串作为判断依据了,之前的版本只支持整数和字符。下面是一个简单的例子
    public static void main(String[]agers){    /*     输入一个字符串到str      */    String str=new Scanner(System.in).next();    switch(str){        case "赵":System.out.println("赵先生");        break;        case "john":System.out.println("外国人");        break;        case "good":System.out.println("打招呼");        break;    }}
    
  • 用switch语句完成下面的编程题目
    1.打印星期几 (10分) [编程]
    从键盘输入一个数字,赋给整型变量day,输入0到6几个数字的时候,就打印星期几,0对于“星期天”,1对应“星期一”,2对应“星期二”,以此类推。如果超出这个范围,打印“非法数字”。
    2.编程实现下面的游戏选择模拟 [编程(无自动批改)]
    首先给出选项,选择职业(战士、法师、猎人);然后选择性别(男、女)、最后选择种族(人类、精灵、矮人)。最后根据用户的输入,打印出用户的选择,适当组织语言。提示:先把输入,然后再写switch,同时打印的时候不要转行。
    3.根据输入判断性别 (10分) [编程]
    从键盘输入一个字符c,如果是‘f’,那么打印“女性”;如果是‘m’打印“男性”;如果是‘u’打印“未确定”;如果是别的字符,打印“非法字符”。
    4.输出成绩范围 (10分) [编程]
    从键盘输入一个字符c,如果是’A’,那么输出“85-100”;如果是’B’, 那么输出“70-84”;如果是’C’, 那么输出“60-69”; 如果是’D’, 那么输出“<60”;如果是其他,输出“错误”。