#include<stdio.h>
int main()
{
int i=9;
switch(i)
{
static int i=1;
i=3;
i=i*i;
case 3:
i=i+11;
case 4:
i=i+22;
case 5:
i=i+33;
default:
i=i+44;
printf("%d",i);
}
printf("%d",i);
}
我不明白实际的行为,输出是 45 9。
谁能给我正当的理由。
- 它是如何工作的?
- 为什么会这样?。
提前谢谢。
variable declaration
之外,在 switch 内执行 case:
之前的任何语句
#include<stdio.h>
int main()
{
int i=9;
switch(i)
{
static int i=1;
printf("I AM HERE %dn", i);
i=3;
i=i*i;
case 3:
i=i+11;
case 4:
i=i+22;
case 5:
i=i+33;
default:
i=i+44;
printf("%d",i);
}
printf("%d",i);
}
输出不会打印字符串I AM HERE
。
此开关类似于写入为
switch(i)
{
static int i=1;
case 3:
i=i+11;
case 4:
i=i+22;
case 5:
i=i+33;
default:
i=i+44;
printf("%d",i);
}
由于值为 i = 9
,则执行default
情况,打印i = 45
。
此外,在交换机内部声明的变量i
的范围仅限于switch {}
块内。因此,一旦控件超出此范围,i = 9
的值就会在main
块中声明
你有两个i
......一个只在构成switch()
体的块中可见,另一个在它外面。 switch(i)
打开外部i
(初始化为 9 的那个(,因此它进入default:
情况。 然后,当它在default:
下运行以下代码时:
default:
i=i+44;
printf("%d",i);
。它使用在switch()
块内声明的i
(初始化为1
的那个(,因此它打印"45"。 不过,这不会影响交换机外部的i
。
在switch()
块的右大括号之后,第二个printf()
:
}
printf("%d",i);
使用交换机外部的i
(初始化为 9 的那个(,因此它打印"9"。
本质上,switch()
体是一个块,在块中声明的变量是该块的本地变量 - 但可以从外部作用域隐藏另一个具有相同名称的变量。
switch 语句的工作原理如下:
- switch 语句计算括号中的表达式(在本例中为
i
值为9
(,并跳转到相应的case
(在本例中为default
,因为不存在case 9
(。 - 声明第一个
case
之前的变量。在这种情况下,将声明一个名为i
的新变量,值为1
。请注意,虽然此名称与先前声明的i
共享名称,但它们是单独的变量,新变量"覆盖"前一个变量,直到 switch 语句结束。由于我们直接跳转到default
标签,因此不会运行此标签之前的任何代码。 - 代码一直运行,直到遇到
break
或 switch 语句结束。然后,在 switch 语句中声明的所有变量都消失了,在我们的例子中,旧的i
变量再次可访问。
在default
标签上,程序将 44 添加到"new"i
变量(以前是 1
(并向其添加 44,使其具有新值 45。然后打印值。
但是,在 switch 语句之后,新的 i
变量已被卸载,旧的 i
变量可以再次访问。它仍然具有旧的值 9
,所以这是打印的值。