• switch-case语句中声明定义的使用


    先上例子:

    1. #include
    2. int functionA(int num,int num2)
    3. {
    4. int a = 100;
    5. if(a < num)
    6. {
    7. printf("num=%d\n", num);
    8. }
    9. else
    10. {
    11. switch(num2)
    12. {
    13. case 0:
    14. //int b = 0; //windows和linux编译环境均会error
    15. //int b; //windows环境不报错,linux环境报错
    16. printf("a1=%d\n", num2);
    17. break;
    18. case 100:
    19. printf("a2=%d\n", num2);
    20. break;
    21. default:
    22. printf("a3=%d", num2);
    23. }
    24. /*
    25. 修改方式:
    26. 1.将声明定义的变量放到作用域全局位置
    27. switch(num2)
    28. {
    29. int b = 0;
    30. int b;
    31. case 0:
    32. printf("a1=%d\n", num2);
    33. break;
    34. case 100:
    35. printf("a2=%d\n", num2);
    36. break;
    37. default:
    38. printf("a3=%d", num2);
    39. }
    40. 1.在定义声明的case范围添加{}来规范对象的作用域
    41. switch(num2)
    42. {
    43. case 0:
    44. {
    45. int b = 0;
    46. int b;
    47. printf("a1=%d\n", num2);
    48. break;
    49. }
    50. case 100:
    51. printf("a2=%d\n", num2);
    52. break;
    53. default:
    54. printf("a3=%d", num2);
    55. }
    56. */
    57. }
    58. }
    59. int main()
    60. {
    61. functionA(100,0);
    62. return 0;
    63. }

    case:int b = 0;
    winsows环境:error: cannot jump from switch statement to this case label……
    error原因
            switch case 中是不能定义对象的,因为只要是在大括号内定义的对象,该对象的作用域就是在当前的那对大括号中,也就是整个switch语句,
            但实际执行时,每个cas可以理解为有其隐含的作用域(其case包含的范围),作用域冲突导致。
    case:int b;
    winsows环境编译通过原因:
            switch-case是代码块,是执行代码块,每条语句应当是执行语句被执行;int b;在C++中是语句,是可执行语句;
    case:int b = 0;
    case:int b;
    linux环境:
    error: a label can only be part of a statement and a declaration is not a statement(标签只能是语句的一部分,并且声明不是语句) 
    error原因:
            1)由于switch的几个case语句在同一个作用域(因为case语句只是标签,它们共属于一个swtich语句块),所以如果在某个case下面声明变量的话,对象的作用域是在俩个花括号之间,也就是整个switch语句,其他的case语句也能看到,这样的话就可能导致错误。
            2)switch-case是代码块,是执行代码块,每条语句应当是执行语句被执行;C标准中,声明不是语句;

    相关拓展:

    1.变量声明的分类
            1)对于变量,变量的声明分为两种,一是引用性声明,不分配内存空间 
            extern int a; //引用性声明,不分配空间
            2)二是定义性声明,既可以说是声明,也可称为定义,分配内存空间
            int b; //定义性声明,分配4字节内存,未初始化
            int c = 10;//定义性声明,分配4字节内存,并初始化

    结论:全部的定义都是声明,部分声明是定义:声明包含定义;
            例:int a = 10;int b;//既是声明也是定义
            例:extern int a;//声明 

    2.变量声明的写法:
            int a; a = 10; //先声明后定义
            int a = 10; //声明的同时定义,这只是一种简写方式(咬文嚼字并不是标准写法) ,编译的时候还是按int a; a = 10; 来进行的,所以执行拆分成2步: 
            1)int a; //C标准中是声明
            2)a = 10; //是语句,赋值语句
    3.变量的作用域
            变量的作用域是指一个变量在程序中起作用的区域,一般可以理解为变量所在的{ }的包围区域。
            在程序块(一个{ }内)中声明的变量(一般称为局部变量),只在该程序块{ }中起作用。
            也就是说,一个变量从被声明的位置开始,到包含该变量声明的程序块最后的大括号为止,这一区间内是起作用的。这样的作用域称为块作用域。

    4.语句的理解
            int a; //在标C中为声明不是语句(另一种说法是:标C中声明是不可执行语句);而在C++中被定义为是语句,是可执行语句;

  • 相关阅读:
    如何在Vue.js中创建模态框(弹出框)
    基于表面电势的AlGaN/GaN MODFET紧凑模型
    nginx配置https详细过程
    企业数据流动安全管理软件(深度解析文章)
    Azure 机器学习 - 使用 ONNX 对来自 AutoML 的计算机视觉模型进行预测
    windows powershell 将U盘启动盘还原回普通U盘
    Java杨辉三角
    电压源的电路分析知识分享
    接口自动化测试工具大全
    报表开发工具DevExpress Reporting v23.2 - 增强PDF导出、多平台打印等
  • 原文地址:https://blog.csdn.net/hao745580264_dawei/article/details/126509286