C语言switch 第一行不能定义变量的解决办法

1.case后加一行代码

switch(cmd)
{
    case CMD_A:break;
    case CMD_B:
        printf("加一行打印代码\n");
        int test_value;
        break;
    default:
        printf("error cmd\n");
        break;

}

2.限定作用域

switch(cmd)
{
    case CMD_A:break;
    case CMD_B:
        {int test_value;}
        break;
    default:
        printf("error cmd\n");
        break;

}

3.加一个空域

switch(cmd)
{
    case CMD_A:break;
    case CMD_B:
        {}
        int test_value;
        break;
    default:
        printf("error cmd\n");
        break;

}

4.加一个空行

switch(cmd)
{
    case CMD_A:break;
    case CMD_B:
        ;
        int test_value;
        break;
    default:
        printf("error cmd\n");
        break;

}

last.直接添加定义时就会报错。

switch(cmd)
{
    case CMD_A:break;
    case CMD_B:
        int test_value;
        break;
    default:
        printf("error cmd\n");
        break;
}
error: a label can only be part of a statement and a declaration is not a statement
错误:标签只能是语句的一部分,声明不是语句

(个人见解,不一定正确)原因分析:
1.case后的第一行不能跟一个定义或者声明;(函数和变量都不行)
2.想要在case分支中定义或者声明内容需要和case语句至少保持有一个其他语句。
3.接下来要看编译器优化了,当分支过少时是遍历分支,一般少于四个分支和ifelse没有区别,大于四个分支时,会产生一个表,先判断是否会进入default中,然后再通过表来直接跳转,当case的连续性不高时,就会产生两个表来实现跳转。因此并没有变量作用域的问题,如果是作用域,那么放在第二行理论来说也是不可行的, 这应该是C语法的一种限定。当语句过多时,如果是作用域的问题就不会存在这种报错,语句都是跳转了,可能执行不到定义的位置了。
4.尽量避免在switch中定义变量。
5.建议用如下方式使用switch case

switch(cmd)
{
    case CMD_A:
        {
            break;
        }
    case CMD_B:
        {
            int test_value;
            break;
        }
    default:
        {
            printf("error cmd\n");
            break;
        }
}

Original: https://www.cnblogs.com/still-smile/p/16529945.html
Author: Smah
Title: C语言switch 第一行不能定义变量的解决办法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/535624/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球