C - 开关情况下的变量 i 行为


#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. 为什么会这样?。

提前谢谢。

除了

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 语句的工作原理如下:

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

default标签上,程序将 44 添加到"new"i变量(以前是 1 (并向其添加 44,使其具有新值 45。然后打印值。

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

相关内容

  • 没有找到相关文章

最新更新