[技术讨论] 语言if语句内包含外部SWITCH的CASE如何理解

[复制链接]
401|3
BitFu 发表于 2025-10-21 17:51 | 显示全部楼层 |阅读模式
本帖最后由 BitFu 于 2025-10-21 17:53 编辑

如下,示意代码:

switch(var)


{
case 0:
... break;
case 1:
...
if(xx)
{
....
case 2:
...break;
case 3:
...break;
}
}


这个执行逻辑是什么,如何转换成容易理解的格式???
ar_dong 发表于 2025-10-23 17:30 | 显示全部楼层
我第一次看到这么写的
sunjd 发表于 2025-10-24 10:13 | 显示全部楼层
根据var的值不同:
1. var = 0: 执行case 0代码,遇到break跳出switch
2. var = 1:
执行case 1代码
判断if条件:
如果xx为真:继续执行if块内代码,然后执行case 2代码,遇到break跳出
如果xx为假:跳过if块,继续执行switch后续代码(如果有)
3. var = 2: 直接跳转到case 2执行
4. var = 3: 直接跳转到case 3执行                                                                                                           这种代码结构的核心问题是:
case标签可以出现在任何位置,包括if语句内部
破坏了正常的代码流程,降低了可读性
容易引入难以发现的bug
建议:在实际开发中避免使用这种写法   
sunjd 发表于 2025-10-24 10:17 | 显示全部楼层
本帖最后由 sunjd 于 2025-10-24 10:18 编辑

如果保持原有逻辑可以换成goto
switch(var)
{
case 0:
    // case 0代码
    break;
   
case 1:
    // case 1代码
    if(xx)
    {
        // if块内代码
        goto case_2;  // 跳转到case 2
    }
    break;
   
case 2:
case_2:
    // case 2代码
    break;
   
case 3:
    // case 3代码
    break;
}


如果重构逻辑推荐使用
switch(var)
{
case 0:
    // case 0代码
    break;
   
case 1:
    // case 1代码
    if(xx)
    {
        // if块内代码
        execute_case2_logic();  // 提取为函数
    }
    break;
   
case 2:
    execute_case2_logic();
    break;
   
case 3:
    // case 3代码
    break;
}

// 提取的公共函数
void execute_case2_logic(void)
{
    // case 2的代码逻辑
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:芯艺工作室

196

主题

1059

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部