gpt4 book ai didi

c++ - 在 switch case 语句中初始化数组

转载 作者:太空宇宙 更新时间:2023-11-03 10:26:00 24 4
gpt4 key购买 nike

异想天开,我在 switch 语句中初始化了以下数组 c MSVC、GCC 和 Clang。在线example

我假设标准允许,在这种情况下我的问题是为什么? ...考虑到在 case 语句中不允许声明和初始化非数组。

int main()
{
char ch;

switch( ch )
{
case 'x':
//int a = 42; // NOT OKAY
break;

case 'y':
int b;
b = 42; // OKAY

case 'z':
int c[2] = { 0 , 1 }; // OKAY (Huh???)
break;
};
}

最佳答案

如果您将示例更改为

int main()
{
char ch;

switch( ch )
{
case 'x':
int c[2] = { 0 , 1 };
break;

case 'z':
int a = 42;
break;
}
}

您会注意到错误现在发生在数组上,但不是 int

最后一种情况实际上允许初始化。

规则不是“不允许在 case 中初始化变量”,而是“不允许跳过变量初始化。”

并且在最后一种情况下不可能跳过初始化。

该规则的原因是在 case 中声明的变量在后续 case 的范围内,并且跳转到后续 case 将绕过初始化。

如果您重写为 goto-sequence,这会(稍微)更清楚一些,因为有关范围和初始化的相同规则适用:

if (ch == 'x') goto x;
if (ch == 'y') goto y;
if (ch == 'z') goto z;
goto end;
{
x:
int a = 42; // goto y or z breaks this
goto end;
y:
int b; // uninitialised, so OK
b = 42;
goto end;
z:
int c[2] = {0, 1}; // No label after this, so can't jump across, so OK
goto end;
}
end:

关于c++ - 在 switch case 语句中初始化数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35177275/

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