2
#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
谁能给我正当的理由。

  1. 这个怎么运作?
  2. 为什么会这样?。

提前致谢。

4

3 回答 3

4

之前没有语句在case:switch 内部执行除了variable declaration

#include<stdio.h>
int main() 
{
    int i=9;
    switch(i)
    {
         static int i=1;
         printf("I AM HERE %d\n", 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 = 9default案例被执行,打印i = 45.

此外,在 switch 内声明的变量的范围i仅限于switch {}块内。因此,一旦控件超出此范围,其值将i = 9在块中声明main

于 2014-12-12T05:30:48.543 回答
1

你有两个i……一个只在构成身体的方块中可见,switch()另一个在身体外面。外部的switch(i)开关i(初始化为 9 的那个),所以它进入了default:外壳。然后它在下面运行以下代码default:

     default:
             i=i+44;
      printf("%d",i);

...它使用块i内的声明switch()(初始化为 的那个1),所以它打印“45”。不过,这不会影响i开关的外部。

switch()块的右大括号之后,第二个printf()

   }
   printf("%d",i);

使用i开关外部的 (初始化为 9 的那个),所以它打印“9”。

本质上,switch()主体是一个块,在块中声明的变量是该块的本地变量——但可以在外部范围内隐藏另一个同名变量。

于 2014-12-12T05:34:06.113 回答
0

switch 语句的工作原理如下:

  1. switch 语句计算括号中的表达式(在这种情况下,i值为9)并跳转到适当的case(在这种情况下是default,因为不case 9存在)。
  2. 声明第一个变量之前的变量casei在这种情况下,使用 value 声明了一个名为的新变量1请注意,虽然这与先前声明的 共享名称i,但它们是单独的变量,并且新变量“覆盖”先前的变量,直到 switch 语句结束。由于我们直接跳转到default标签,所以没有运行该标签之前的代码。
  3. 代码一直运行,直到遇到breakswitch 语句或结束。然后在 switch 语句中声明的所有变量都消失了,在我们的例子中,旧i变量再次可以访问。

default标签处,程序将 44 添加到“新”i变量(以前是1)并添加 44,给它新值 45。然后打印该值。

然而,在 switch 语句之后,新i变量已被卸载,旧i变量再次变得可访问。它仍然具有 的旧值9,因此这是打印的值。

于 2014-12-12T05:35:27.607 回答