c ++:为什么我们可以在切换的时候声明一个变量

int i;
i = 2;
switch(i)
{
    case 1: 
        int k;
        break;
    case 2:
        k = 1;
        cout<<k<<endl;
        break;
}

我不知道为什么上面的代码工作。

在这里,我们不能进入情况1,但为什么我们可以在情况2中使用k


其实有两个问题:

1.为什么我可以在case标签后声明一个变量?

这是因为在C ++标签中必须采用以下形式:

N3337 6.1 / 1

标记的语句:

...

  • attribute-specifier-seqopt case constant-expressionstatement
  • ...

    而在C++声明中声明也被认为是声明(与C相反):

    N3337 6/1:

    声明:

    ...

  • 声明语句
  • ...

    2.为什么我可以跳过变量声明然后使用它?

    因为:N3337 6.7 / 3

    可以将其转换为块, 但不能绕过具有初始化的声明 。 一个跳转的程序( switch语句到case标签的转换被认为是这方面的一个跳跃 。)

    从具有自动存储持续时间的变量不在范围内的点到它在范围内的点不合格, 除非变量具有标量类型 ,具有简单默认构造函数和简单析构函数的类类型,则cv限定版本这些类型之一或前面类型之一的数组,并声明不带初始值设定项(8.5)。

    由于k是标量类型,并且在声明跳过的位置未初始化,所以它的声明是可能的。 这在语义上是等效的:

    goto label;
    
    int x;
    
    label:
    cout << x << endl;
    

    然而,如果x在声明点初始化,这将不起作用:

     goto label;
    
        int x = 58; //error, jumping over declaration with initialization
    
        label:
        cout << x << endl;
    
    链接地址: http://www.djcxy.com/p/2419.html

    上一篇: c++: why can we declare a variable in case of switch

    下一篇: In C, do braces act as a stack frame?