gpt4 book ai didi

c++:为什么我们可以在switch的情况下声明一个变量

转载 作者:搜寻专家 更新时间:2023-10-31 02:16:08 25 4
gpt4 key购买 nike

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

我不知道上面的代码为什么有效。

在这里,我们永远无法进入案例 1,但为什么我们可以在案例 2 中使用 k

最佳答案

其实有2个问题:

<强>1。为什么我可以在 case 标签之后声明一个变量?

这是因为在 C++ 中标签必须是这样的:

N3337 6.1/1

labeled-statement:

...

  • attribute-specifier-seqopt case constant-expression : statement

...

C++ 中,声明语句 也被视为语句(与 C 相对):

N3337 6/1:

statement:

...

  • declaration-statement

...

<强>2。为什么我可以跳过变量声明然后使用它?

因为:N3337 6.7/3

It is possible to transfer into a block, but not in a way that bypasses declarations with initialization. A program that jumps (The transfer from the condition of a switch statement to a case label is considered a jump in this respect.)

from a point where a variable with automatic storage duration is not in scope to a point where it is in scope is ill-formed unless the variable has scalar type, class type with a trivial default constructor and a trivial destructor, a cv-qualified version of one of these types, or an array of one of the preceding types and is declared without an initializer (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;

关于c++:为什么我们可以在switch的情况下声明一个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37368137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com