首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >切换语句中DEFAULT后CASE内的c++变量初始化

切换语句中DEFAULT后CASE内的c++变量初始化
EN

Stack Overflow用户
提问于 2016-09-25 02:55:36
回答 1查看 747关注 0票数 2

在使用代码时,我遇到了一个有趣的特性。我使用的是打开了Cygwin和C++14 (-std=c++14)的Eclipse CDT 4.5.2。CASE中的变量初始化通常是被禁止的,但是下面的代码会编译:

代码语言:javascript
复制
switch( int switchStatement = 11)
{
    default:
        ++j;
        break; // break is optional, still compiles even if omitted
    case 11:
        int caseVariable = 0;
        ++j;
}

如果添加了另一个案例,则会引发异常“跳转到案例标签”。

代码语言:javascript
复制
switch( int switchStatement = 11)
{
    default:
        ++j;
    case 11:
        int caseVariable = 0;
        ++j;
    case 12: // exception
        ++j;
}

有人能给我解释一下它是怎么工作的吗?

EN

回答 1

Stack Overflow用户

发布于 2016-09-25 03:27:19

为什么在last case语句中声明变量时,在第二个case语句中出现错误,但没有出现错误?

因为跳转不能传递同一作用域中的变量声明,这是C++的一条规则。所以当你跳到第二种情况时,你会跳过第一种情况中的变量声明,但最后一种情况中的变量声明是OK的,因为它从来没有跳过。

该规则的原因是,如果允许跳过变量声明,编译器将很难确定是否为该变量调用析构函数。如果你跳过了变量声明,你就不需要调用析构函数,如果你没有跳过,你就会调用。

在一个case语句中声明和初始化的变量在其他case块中仍然可见,但它们不会被初始化,因为初始化代码属于另一个case。

在C++中,问题是有范围的。在这里,case语句是“标签”。因此,编译器将它们视为从一条语句跳转到另一条语句。在这个特定的例子中,编译器不会理解如何继续下去。要解决此问题,您可以将case中的代码包含到{}块中。额外的{和}表示编译器可以毫不费力地确定何时调用析构函数。因此,在声明新变量时为特定的case语句提供作用域或大括号是很重要的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39679871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档