switch-case中default的顺序问题

本文详细介绍了switchcase语句的使用方法,包括语法格式、适用变量类型、case语句规则及default分支的作用。并通过多个实例展示了不同情况下switchcase语句的行为表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

switch case语句用于判断一个变量与一系列值中某个值是否相等,每个值称为一个分支
语法格式:
switch(expression){
    case value :
       //语句
       break; //可选
    case value :
       //语句
       break; //可选
    //你可以有任意数量的case语句
    default : //可选
       //语句
}
switch case语句有如下规则:

1.switch 语句中的变量类型可以是:byte、short、int、char。jdk1.5开始:支持枚举类型;jdk1.7开始:支持String类型。同时case标签必须为字符串常量或字面量。
2.switch语句可以拥有多个case语句。每个case后面跟一个要比较的值和冒号。
3.case语句中的值数据类型必须与变量的数据类型相同,而且只能是常量或者字面量
4.当变量的值与case语句的值相等时,执行case语句之后的语句,直至遇到break语句跳出switch语句
5.switch语句可以包含一个default分支,一般放到最后(可以在任何位置,建议在最后一个。)。default在没有case语句的值和变量值相等的时候执行。

举例说明
  public static void main(String args[]){
      char grade = 'C';
 
      switch(grade)
      {
         case 'A' :
            System.out.println("优秀"); 
            break;//用于跳出switch语句
         case 'B' :
         case 'C' :
            System.out.println("良好");
            break;
         case 'D' :
            System.out.println("及格");
            break;
         case 'F' :
            System.out.println("你需要再努力努力");
            break;
            //当没有条件符合时 
         default :
            System.out.println("未知等级");
      }
      System.out.println("你的等级是 " + grade);
   }

结果为:

良好
你的等级是 C

如果case语句块中没有break语句时,JVM并不会顺序输出每一个case对应的返回值,而是继续匹配,匹配不成功则执行default语句。

   public static void main(String args[]){
      int i = 5;
      switch(i){
         case 0:
            System.out.println("0");
         case 1:
            System.out.println("1");
         case 2:
            System.out.println("2");
         default:
            System.out.println("default");
      }
   }

输出:

default

如果case语句块中没有break语句时,匹配成功后,从当前case开始,后续所有case的值都会输出,直至遇到break,跳出switch语句,如果没有break语句,后续所有case的值都会输出。

   public static void main(String args[]){
      int i = 1;
      switch(i){
         case 0:
            System.out.println("0");
         case 1:
            System.out.println("1");
         case 2:
            System.out.println("2");
         case 3:
            System.out.println("3");
         default:
            System.out.println("default");
      }
   }

输出:

1
2
3
default
上述讨论都是将default放置在switch语句块中的最后一句,那么放置在其他地方呢?
        int n = 'c';
        switch (n++){
            default:
                System.out.print("error");
            case 'a': case 'A': case 'b': case 'B':
                System.out.print("good");
                break;
            case 'c': case 'C':
                System.out.print("pass");
            case 'd': case 'D':
                System.out.print("warn");
        }

输出:

passwarn
这里需要注意的是,之前提及到,default语句会在所有case语句都不匹配之后再执行,所以说default语句可以在任何位置(如果不是在最后,但是得加上break语句)。由于case ‘c’: case ‘C’:没有break语句,所以会执行接下来的语句,那么没有条件符合呢,又会输出什么?

即:

        int n = 'c';
        switch (n++){
            default:
                System.out.print("error");
            case 'a': case 'A': case 'b': case 'B':
                System.out.print("good");
                break;
                //这里把上述的c换成了e,此时并没有条件符合
            case 'e': case 'E':
                System.out.print("pass");
            case 'd': case 'D':
                System.out.print("warn");
        }

输出:

errorgood
由于没有条件符合,所以会执行default语句下的语句。但是default语句块中没有break,所以会继续执行,直到遇到了case ‘a’: case ‘A’: case ‘b’: case ‘B’: 中的break,退除swtich语句块。这里举两个例子是想说明,第一:default语句会在所有case语句不符合的情况下执行。第二:当default不在末尾时,如果执行了,又没有break语句,那么会继续依次执行下面的语句块,直到遇到break。

当然这里的第一点需要说明一下,如果default语句前,有条件符合,又没有break语句,依然会执行。前面已经示例过。

最后再体验一下,switch-case。以下程序会输出啥


        int x = 2,y=3;

        switch(x)
        {
            default:
                y++;
            case 3:
                y++;
                break;
            case 4:
                y++;
        }

        System.out.println("y="+y);

答案:

y=5
<think>好的,用户现在希望用switch-case结构来编主函数,替换之前的示例。首先,我需要理解用户的需求。原来的主函数是通过顺序执行各个操作,现在用户可能希望有一个菜单驱动的交互界面,让用户可以选择不同的操作,比如创建链表、插入节点、删除节点等等。 接下来,我需要回顾之前的代码结构。原来的主函数调用了CreatListRH、PrintList、LengthListH等函数,现在需要用switch-case来实现菜单选择。这时候需要考虑如何循环显示菜单,直到用户选择退出。 首先,主函数需要一个循环,比如使用while循环,让用户可以多次选择操作。然后,在每次循环中显示菜单选项,使用printf打印选项,比如1.创建链表,2.插入节点等等。用户输入选择后,用scanf获取输入,并用switch-case处理不同的情况。 需要注意的是,在创建链表时,原来的CreatListRH函数会提示用户输入字符,但用户输入后可能会有换行符留在缓冲区,这可能会影响后续的输入。比如,在输入菜单选项时,如果之前有未处理的换行符,会导致scanf直接读取而跳过输入。因此,需要在适当的位置清除输入缓冲区,比如在scanf后使用while(getchar() != '\n');来清空缓冲区。 另外,每个case分支需要处理对应的函数调用。例如,选择1时调用CreatListRH,然后打印链表;选择2时需要用户输入插入的位置和数据,然后调用InsertList函数。需要注意的是,插入和删除操作需要检查链表是否已经创建,否则可能会访问空指针。因此,在调用这些函数之前,应该检查head是否已经初始化,即是否已经创建了链表。如果用户没有先创建链表,应该提示用户先执行创建操作。 此外,处理用户输入的时候,需要确保输入的数据类型正确。例如,当用户输入位置时,应该是一个整数,如果输入了非数字字符,可能会导致程序出错。因此,可能需要添加错误处理机制,或者提示用户输入正确的类型。 在显示菜单时,可能需要一个退出选项,比如选项0,用来退出循环。循环条件可以设置为一个标志变量,比如int running = 1;,当用户选择退出时,将running设置为0,结束循环。 最后,需要考虑内存管理的问题。在程序退出前,应该释放链表占用的内存,避免内存泄漏。这需要遍历链表,逐个释放每个节点的内存。因此,可能需要添加一个DestroyList函数,用于释放链表内存。 总结步骤: 1. 使用while循环显示菜单,直到用户选择退出。 2. 使用scanf获取用户选择,并用switch-case处理不同操作。 3. 每个case分支调用对应的函数,并处理可能的错误,比如链表未初始化。 4. 处理输入缓冲区,避免换行符影响后续输入。 5. 添加退出选项,并释放链表内存。 需要测试各个选项的功能是否正常,比如创建链表后是否能正确插入、删除,以及输入非法选项时的处理。同时,需要确保所有情况下内存都被正确释放,避免泄漏。</think>以下是用 `switch-case` 结构实现的交互式主函数,用户可以通过菜单选择链表的操作: ```c #include <stdio.h> #include <stdlib.h> // 省略之前的链表函数定义... int main() { LinkList head = NULL; // 初始链表为空 int choice; char data; int pos; while (1) { // 循环显示菜单 printf("\n----- 链表操作菜单 -----\n"); printf("1. 创建新链表\n"); printf("2. 插入节点\n"); printf("3. 删除节点\n"); printf("4. 打印链表\n"); printf("5. 计算链表长度\n"); printf("6. 按值查找节点\n"); printf("7. 按位置查找节点\n"); printf("0. 退出程序\n"); printf("请输入操作编号: "); scanf("%d", &choice); switch (choice) { case 1: // 创建链表 if (head != NULL) { printf("警告:已存在链表,重新创建会覆盖旧数据!\n"); } getchar(); // 清除输入缓冲区的换行符 head = CreatListRH(); printf("链表创建完成\n"); PrintList(head); break; case 2: // 插入节点 if (head == NULL) { printf("错误:请先创建链表!\n"); break; } printf("输入插入位置和数据(格式:位置 字符): "); scanf("%d %c", &pos, &data); if (InsertList(head, data, pos)) { printf("插入成功!\n"); PrintList(head); } else { printf("插入失败,请检查位置是否合法\n"); } break; case 3: // 删除节点 if (head == NULL) { printf("错误:链表未创建!\n"); break; } printf("输入要删除的位置: "); scanf("%d", &pos); if (DeleteList(head, pos)) { printf("删除成功!\n"); PrintList(head); } else { printf("删除失败,请检查位置是否合法\n"); } break; case 4: // 打印链表 if (head == NULL) { printf("链表未创建!\n"); } else { PrintList(head); } break; case 5: // 计算长度 if (head == NULL) { printf("链表未创建!\n"); } else { printf("链表长度: %d\n", LengthListH(head)); } break; case 6: // 按值查找 if (head == NULL) { printf("链表未创建!\n"); break; } printf("输入要查找的字符: "); getchar(); // 清除换行符 scanf("%c", &data); ListNode* node = LocateNode(head, data); if (node != NULL) { printf("找到字符 %c\n", node->data); } else { printf("未找到该字符\n"); } break; case 7: // 按位置查找 if (head == NULL) { printf("链表未创建!\n"); break; } printf("输入要查找的位置: "); scanf("%d", &pos); ListNode* target = GetNode(head, pos); if (target != NULL) { printf("位置 %d 的字符为: %c\n", pos, target->data); } else { printf("位置无效\n"); } break; case 0: // 退出程序 printf("程序退出\n"); // 释放链表内存(需补充销毁函数) exit(0); default: printf("无效操作编号,请重新输入!\n"); } // 清除输入缓冲区残留字符 while (getchar() != '\n'); } return 0; } ``` --- ### 代码说明 1. **菜单驱动**:通过 `switch-case` 实现用户交互,每个 `case` 对应一种链表操作。 2. **输入验证**: - 检查链表是否已创建(`head == NULL` 时禁止操作) - 对插入/删除位置进行合法性判断(由 `InsertList` 和 `DeleteList` 内部处理) 3. **内存管理提示**: - 退出程序时建议添加链表销毁函数(需自行实现 `DestroyList`) 4. **输入缓冲区处理**: - 使用 `getchar()` 和 `while (getchar() != '\n')` 清除残留字符,避免影响后续输入 --- ### 使用示例 ``` ----- 链表操作菜单 ----- 1. 创建新链表 2. 插入节点 3. 删除节点 4. 打印链表 5. 计算链表长度 6. 按值查找节点 7. 按位置查找节点 0. 退出程序 请输入操作编号: 1 请输入链表各节点的数据(字符型): abcde↵ 链表创建完成 当前链表的内容为: a b c d e ``` --- ### 扩展建议 1. **添加销毁函数**:在退出前释放链表内存 ```c void DestroyList(LinkList head) { ListNode *p = head; while (p != NULL) { ListNode *temp = p; p = p->next; free(temp); } } ``` 2. **增强错误处理**:例如输入非数字时的异常处理 3. **支持连续插入/删除**:可在 `case` 内添加循环操作
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值