如何处理在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
语句在具有可变修改类型的标识符范围内具有关联的case
或default
标签,则整个switch语句应在该标识符的范围内。 154)
脚注:
154)也就是说,声明要么在switch语句之前,要么跟在与包含声明的块中的
switch
相关联的最后一个case
或default
标签之后。
第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 1
, i
有一个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