C语言-switch 选择结构

目录

switch 选择结构

    /*
     if(条件表达式){
        代码块
     }
     
     switch(条件表达式){
        case 整数:
            语句;
            break;
         case 整数:
            语句;
            break;
        default:
            语句;
            break;
     }
     // switch 会取出条件表达式的值,如果与 case 后面整数相等就会执行这个 case 下的语句,break 就会跳出,如果前面的都不满足,那么就会执行 default
     
     // 1,拿到的条件表达式的值必须是整数才行
     // 2,利用条件表达式的值与 case 后面的整数是否相等,如相等,就会执行该 case 后面的语句,
     // 3,执行完该语句,遇到 break 就会结束整个 switch 语句,也就是说后面得有语句都不会执行
     // 4,如果前面的 case 后面值与条件表达式的值不相等就会继续执行后面的 case
     // 5,如果前面的条件表达式与 case 的整数都不相等就会执行 default 的case
     
     */
    
    int age = 1;
    switch (age) {
        case 3:
            printf("还在喝奶的阶段");
            break; // 执行到 break 就会结束 switch 语句
        case 6:
            printf("该上小学了");
            break;
        case 18:
            printf("该去网吧打游戏了");
            break;
        default:
            printf("该好好上班,挣钱养家");
            break;
    }
  • switch 的结束
    • 执行到相等的 case 后面的整数,遇到 break
    • 执行到 switch 语句的大括号
  • 如果执行到对应的 case 时,但是没有写 break,此时后面的 case 和 default 语句会失效,但是里面的代码块不会失效(case 的穿透问题)
    int age = 6; // age = 6 的时候
    switch (age) {
        case 3:
            printf("还在喝奶的阶段");
            break;
        case 6:
            printf("该上小学了"); // 执行到这个 case 的代码,但是没有写 break,后面的 case 和 default 代码就会失效.但是里面的代码块像 parinf 不会失效
            // 没有写 break
        case 18:
            printf("该去网吧打游戏了");
            // 没有写 break
        default:
            printf("该好好上班,挣钱养家");
            // ,没有写 break
    }


// 相当于执行了这个代码
    int age = 6; // age = 6 的时候
    switch (age) {
        case 3:
            printf("还在喝奶的阶段");
            break;
        case 6:
            printf("该上小学了"); // 执行到这个 case 的代码,但是没有写 break,后面的 case 和 default 代码就会失效.但是里面的代码块像 parinf 不会失效
            // 没有写 break
        // case 18:
            printf("该去网吧打游戏了");
            // 没有写 break
        // default:
            printf("该好好上班,挣钱养家");
            // ,没有写 break
    }



// 控制台输出:
该上小学了该去网吧打游戏了该好好上班,挣钱养家
  • 最后一个case 或者 default后面的 break 可以省略,因为后面就是switch 的大括号,也是代表 switch 的结束

  • switch 的注意点

    • Switch的条件表达式必须是返回整数的格式,也就是说()中只能放整数
        // 只有整数类型才可以哦
            float num = 10.3f;
        switch (num) { // 报错
            case 10:
                printf("是一个小数,会打印么?");
                break;
            default:
                break;
        }
        
            // char 类型可以,char 类型可以转换为整数
        char str = 'a';
        switch (str) {
            case 'a':
                printf("char 类型是可以的,因为 char 类型可以转换为整数,char 类型的底层是阿斯克码????");
                break;
                
            default:
                printf("????");
                break;
        }
    
    • case 的取值必须是整数,或者能够转换为整数的类型
    • case 的取值不能重复
            int num = 10;
            switch (num) {
                case 10:
                    printf("10");
                    break;
                case 10: // 报错,case 不能重复
                    printf("10");
                    break;
                default:
                    printf("????");
                    break;
            }
    
    • case 后面不能放变量
      • 因为系统在编译的时候会对 switch后面的 case进行优化,会根据后面 case 的值生成一个取值表
                int num = 10;
                switch (10) {
                    case num: // 报错,不能放变量
                        printf("10");
                        break;
                    default:
                        printf("????");
                        break;
                }
    
    • default 的位置
      • 无论 default 的位置写在哪个位置,都是最后执行
      • 如果 default 放在前面了,那么就一定要加上 break,不能省略
      • 只要 default 满足,那么后面的 case 也会失效,所以注意写上 break

switch 练习

    /*
     要求用户输入一个分数,根据用户输入的分数输出对应的等级
     A 90 - 100
     B 80 - 89
     C 70 - 79
     D 60 - 69
     E 0 - 59
     */
    printf("请您输入一个分数,已回车结束\n");
    int garde = 0;
    scanf("%i",&garde);
    // 第一种方法
    switch (garde / 10) { // 分数除以 10 再利用隐式转换为 int 类型就可以得到整数
        case 10: // 利用 case 的穿透
        case 9:
            printf("A");
            break;
        case 8:
            printf("B");
            break;
        case 7:
            printf("C");
            break;
        case 6:
            printf("D");
            break;
        default:
            printf("E");
            break;
    }
    
    // 第二种方法
    if (garde >= 90 && garde <= 100){
        printf("A");
    }else if (garde >= 80 && garde <= 89)
    {
        printf("B");
    }else if (garde >= 70 && garde <= 79)
    {
        printf("C");
    }else if (garde >= 60 && garde <= 69)
    {
        printf("D");
    }else if (garde >= 0 && garde <= 59)
    {
        printf("E");
    }else{
        printf("输入成绩错误");
    }
    // 第三种方法(巧妙的利用 if else if 的结构,从上往下执行,第一条不满足执行到第二条,执行到后面的 else if 代表肯定前面的条件不符合.所以)
    if (garde < 0 || garde > 100){
        printf("您输入的分数不对");
    }else if (garde >= 90 && garde <= 100){
        printf("A");
    }else if (garde >= 80)
    {
        printf("B");
    }else if (garde >= 70)
    {
        printf("C");
    }else if (garde >= 60)
    {
        printf("D");
    }else{
        printf("E");
    }
    return 0;
}

  • switch 的局限性
    • 在开发中中 if 比较多,比较灵活
    • 如果说是对固定的值,进行判断,并且这些值的数量不多的时候可以使用 switch
    • 从理论上来说 switch的性能效率要比 if 高
    // 练习 2
    /*
    // 从键盘输入一个数字,判断其是哪个季节
    printf("请您输入一个数字,以回车结束");
    int num = 0;
    scanf("%i",&num);
    switch (num) {
        case 12:
        case 1:
        case 2:
            printf("冬季");
            break;
        case 3:
        case 4:
        case 5:
            printf("春节");
            break;
        case 6:
        case 7:
        case 8:
            printf("夏季");
            break;
        case 9:
        case 10:
        case 11:
            printf("秋季");
            break;
        default:
            printf("你输入的是啥玩意");
            break;
    }
    */
    
    // 写一个计算器,用户输入一个数,操作符,再一个数,根据操作符计算结果
    /*
    printf("请您输入第一个数,操作符,和第三个数,以逗号分割,以回车结束\n");
    printf("操作符:1:+,2:-,3:/,4:*\n");
    int num1,num2,num3;;
    scanf("%i,%i,%i",&num1,&num2,&num3);
    switch (num2) {
        case 1:
            printf("两数相加:result = %i\n",num1+num3);
            break;
        case 2:
            printf("两数相减:result = %i\n",num1-num3);
            break;
        case 3:
            printf("两数相除:result = %i\n",num1/num3);
            break;
        case 4:
            printf("两数相乘:result = %i\n",num1*num3);
            break;
        default:
            printf("num2只接受 1-4 的整数");
            break;
    }
    */
    
    printf("请您输入第一个数,以回车结束\n");
    int num1,num2;
    scanf("%i",&num1);
    printf("请您输入操作符,以回车结束\n");
    // char temp;
    // scanf("%c",&temp);
    getchar(); // 使用getchar()将前面的\n 取出来
    char op;
    scanf("%c",&op); // 此时注意前面有一个scanf 函数,输入了回车后此时输入缓冲区中还是保留的\n,所以第二个 scanfr 让输入一个%c 类型的字符时就不会让你输入了
    printf("请您输入第二个数,以回车结束\n");
    scanf("%i",&num2);
    int result = -1;
    switch (op) {
        case '+':
            result = num1 + num2;
            break;
        case '-':
            result = num1 - num2;
            break;
        case '*':
            result = num1 * num2;
            break;
        case '/':
            result = num1 / num2;
            break;
        default:
            printf("只接受 '+','-','*','/' 操作符");
            break;
    }
    printf("result = %i\n",result);
    return 0;
}