c语言之switch语句的用法及注意事项

本文通过LeetCode第860题柠檬水找零的示例,对比了C语言中switch与ifelse的使用。在多条件判断场景下,switch提供更整洁的代码结构,逻辑清晰,尽管在运行效率上两者相差无几。

关于C语言中我们做判断的时候一般是会想到if else,常见的if else的写法为:
if(表达书)
{}
else if(表表达式)
{}
else
{}
当出现更多的if else嵌套的时候通常会使我们的代码变的较为繁琐,使得我们在观看自己的代码的时候容易讲逻辑给混淆,故此次介绍一下switch的用法,switch的用法在代码中的运用广度没有if else 较强,但是在多个判断中可起到很关键的作用本次以leet第860题柠檬水找零为例子进行说明,下面两段代码:

bool lemonadeChange(int* bills, int billsSize){
    int mon[2]={0};
    for(int i=0;i<billsSize;i++)
    {
        switch(bills[i])
        {
            case 5:{mon[0]++;break;};
            case 10:
            {
                mon[0]--;
                mon[1]++;
                break;
            }
            case 20:
            {
                if(mon[1]>0)
                {
                    mon[1]--;
                    mon[0]--;
                }
                else mon[0]-=3;
                break;
            }
        }
        if(mon[0]<0) return false;
    }
    return true;
}
bool lemonadeChange(int* bills, int billsSize){
    int mon[2]={0};
    for(int i=0;i<billsSize;i++)
    {
        int temp=bills[i]-5;
        if(temp>0)
        {
            if(temp>5)
            {
                if(mon[1]!=0&&mon[0]!=0)
                {
                    mon[0]--;
                    mon[1]--;
                }  
                else if(mon[0]>=3)
                    mon[0]-=3;
                else return false;            
            }
            else 
            {
                if(mon[0]>0)
                {
                    mon[1]++;
                    mon[0]--;
                } 
                else
                    return false;
            }
        }
        else
            mon[0]++;
    }
    return true;    
}

上述两段代码分别为使用if else 与switch的代码的实例,两者在运行内存和速度上相差无几,但是switch的看起来更整洁,逻辑清晰。
注意:
1、在switch中有一点需要明确那就是在break的引用的问题,switch的操作中首先将case后的表达式与switch中括号的内容进行匹配,如果两者相等,则执行该case及下面的所有代码,知道执行完毕switch中的所有代码,而我们引用switch的目的只是需要执行其中的一个case,然后跳出switch,故在每个case的末尾需加入break将此次的switch跳出,若利用continue跳出case,依然会执行下面的case。
2、case 后面必须是一个整数,或者是结果为整数的表达式,但不能包含任何变量。
eg:
case ‘A’: printf(“…”); break; //正确,字符和整数可以相互转换。
case a: printf(“…”); break; //错误,不能包含变量
3、default 不是必须的。当没有 default 时,如果所有 case 都匹配失败,那么就什么都不执行。

<think>嗯,用户想了解C语言switch语句的使用方法和注意事项。首先,我得回忆一下switch的基本结构,比如case、break、default这些关键字的作用。然后,用户可能需要具体的例子来理解,所以得找几个典型的代码示例。比如引用里的四则运算和成绩等级的例子,这些应该能帮助用户更好地理解。 注意事项方面,break语句的重要性肯定要提到,否则会出现case穿透的问题。还有case后面的常量表达式类型,只能是整型或字符型,不能是浮点型或者字符串。另外,default的作用是处理未列出的情况,虽然不是必须的,但加上去会更安全。 用户可能还容易忽略switch表达式的类型限制,比如不能用变量或者范围判断,只能处理离散的值。这时候可能需要解释为什么有时候用if-else更合适。另外,case的排列顺序也可能影响可读性,比如把常见的情况放在前面。 需要检查引用的内容是否有帮助,比如引用1中的if语句例子可能和switch无关,但引用2、3、4里的switch案例可以直接用上。要确保回答的结构清晰,分点列出使用方法和注意事项,每个部分用例子说明,比如代码块展示正确的用法注意事项里用代码说明错误情况。 还要考虑用户可能的常见错误,比如忘记写break导致多个case被执行,或者误用非整型的变量。这些都需要在注意事项里强调。最后,生成的相关问题要引导用户深入,比如优化、与if的比较、调试技巧等,这样他们可以继续学习相关内容。</think>### C语言switch语句详解 #### 一、基本使用方法 switch语句是C语言中多分支选择结构的核心语法,适用于处理**离散值的条件判断**。基本结构如下: ```c switch(表达式) { case 常量1: 语句块1; break; case 常量2: 语句块2; break; ... default: 默认语句块; } ``` 示例代码(四则运算实现)[^2]: ```c switch(c1) { case '+': printf("%f+%f=%f\n",a,b,a+b); break; case '-': printf("%f-%f=%f\n",a,b,a-b); break; //...其他运算符处理 } ``` #### 二、关键特性 1. **表达式要求**: - 必须是**整型或字符型**表达式(int/char) - 不支持浮点型或字符串判断 ```c int grade = 85; switch(grade/10) { // 将分数转换为整型区间判断[^3] case 9: printf("A"); break; case 8: printf("B"); break; } ``` 2. **case穿透现象**: - 未使用`break`时会继续执行后续case的语句 - 故意利用穿透特性的特殊写法: ```c switch(month) { case 1: case 3: case 5: // 处理31天的月份 printf("31天"); break; } ``` 3. **default子句**: - 处理未匹配任何case的情况 - 建议始终包含default分支增强健壮性[^4] #### 三、六大注意事项 1. **类型限制**: ```c float f = 1.5; switch(f) { /* 错误!表达式不能是浮点型 */ } ``` 2. **break的必要性**: ```c switch(n) { case 1: printf("1"); case 2: printf("2"); // 当n=1时会连续输出"12" } ``` 3. **case值要求**: - 必须是**编译期常量**,不可使用变量 ```c int x = 10; switch(n) { case x: /* 错误!case值必须是常量 */ } ``` 4. **作用域限制**: - case语句块内定义变量必须用大括号包裹 ```c case 1: { int temp = 10; // 正确写法 break; } ``` 5. **执行顺序**: - 严格按照case排列顺序进行匹配判断 6. **与if语句对比**: | 特性 | switch | if-else | |-----------|-----------------|-------------| | 判断类型 | 离散值 | 任意条件表达式 | | 执行效率 | 跳转表(更快) | 顺序判断 | | 可读性 | 多分支时更清晰 | 复杂条件更灵活 | #### 四、调试技巧 1. 使用-Wswitch-enum编译选项检查枚举值覆盖 2. 使用__builtin_unreachable()标记不可达分支(GCC扩展) 3. 覆盖率测试时注意检查default分支
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值