c/c++语言开发共享switch语句如何工作?

如何处理在switch-case块中标记语句的任何case之前的语句。 请解释以下程序的行为

PROG1:

 #include int main() { switch(1) { int i=0; case 1:printf("%d",i); } getchar(); return 0; } 

输出:垃圾值。

PROG2:

 #include int main() { switch(1) { printf("Inside Switch"); case 1:printf("Case 1n"); } printf("Outside Switch"); getchar(); return 0; } 

输出:

情况1

外部交换机。

根据程序2,在案例标记语句之前的语句似乎无法访问但是为什么i在第一个程序中没有得到未声明变量i的错误(仅警告)。

如果有人能够详细解释如何在内部处理switch语句,那将会非常有用。

    这可以通过c标准的引用来解释。 我引用了适用于您的问题的标准中的相关部分。

    6.8.4.2 switch语句

    第4段:

    switch语句使控制跳转到,进入或超过作为switch主体的语句,具体取决于控制表达式的值,以及是否存在default标签以及交换机上或中的任何case标签的值身体……

    第2段:

    如果switch语句在具有可变修改类型的标识符范围内具有关联的casedefault标签,则整个switch语句应在该标识符的范围内。 154)

    脚注:

    154)也就是说,声明要么在switch语句之前,要么跟在与包含声明的块中的switch相关联的最后一个casedefault标签之后。

    第7段:
    示例在人工程序片段中

     switch (expr) { int i = 4; f(i); case 0: i = 17; /* falls through into default code */ default: printf("%dn", i); } 

    标识符为i的对象存在自动存储持续时间(在块内)但从未初始化,因此如果控制表达式具有非零值, 则对printf函数的调用将访问不确定的值。 同样,无法访问函数f的调用


    上述内容适用于问题中的两个代码示例。
    Example 1i有一个Indeterminate值,因为它从未被初始化,因此打印垃圾,而在
    Example 2 ,未达到printf调用,因为控件跳转到匹配的case标签。

    基本上,一个开关就像一个goto到相应的标签 – 不执行干预语句。 变量定义(实际上在编译时发生)确实发生,但是如果它们包含初始化,那么它也会被跳过。

    切勿在开关中写入不属于任何情况或默认值的语句,因为它们不会被执行。

    注意:声明可以写在那里但不是语句(int i;是声明但是int i = 10;是声明+赋值=声明所以赋值不会在那里执行..!)

     switch(a) { printf("This will never print"); // this will never executed case 1: printf(" 1"); break; default : break; } 

    请看这个为什么变量不能在标签之后的switch语句中声明?

    需要了解更多c/c++开发分享switch语句如何工作?,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!

      以上就是c/c++开发分享switch语句如何工作?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/979767.html

      (0)
      上一篇 2021年12月13日
      下一篇 2021年12月13日

      精彩推荐