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; } }

__EOF__

本文作者漫漫程序之路
本文链接https://www.cnblogs.com/still-smile/p/16529945.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Smah  阅读(642)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示