gpt4 book ai didi

在 SWITCH 语句中的 DEFAULT 之后,CASE 中的 c++ 变量初始化

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:12:05 24 4
gpt4 key购买 nike

我在玩代码时遇到了一个有趣的怪癖。我正在使用启用了 Cygwin 和 C++14 (-std=c++14) 的 Eclipse CDT 4.5.2。 CASE 内部的变量初始化通常是被禁止的,但是下面的代码可以编译:

switch( int switchStatement = 11)
{
default:
++j;
break; // break is optional, still compiles even if omitted
case 11:
int caseVariable = 0;
++j;
}

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

switch( int switchStatement = 11)
{
default:
++j;
case 11:
int caseVariable = 0;
++j;
case 12: // exception
++j;
}

谁能给我解释一下这一切是如何运作的?

最佳答案

为什么在第二种情况下会出错,而在最后一个 case 语句中声明变量时却不会出错??

因为跳转不能越过变量是C++的规则在同一范围内声明。所以当你跳到案例 2 时,你跳过了案例 1 中的变量声明。但是案例 1 中的变量声明最后一种情况是可以的,因为它永远不会被跳过。

这条规则的原因是如果你允许跳过一个变量声明编译器很难判断是否为该变量调用析构函数。如果你跳过变量声明你不需要调用析构函数,如果你没有跳然后你会。

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

在 C++ 中,问题是范围内的。在这里,案例陈述是“标签”。因此,编译器会将它们视为从一条语句跳转到另一条语句。在这个特定的例子中,编译器不会理解如何进一步进行。要解决此问题,您可以将 case 中的代码包含到 {} block 中。额外的 { 和 } 意味着编译器可以轻松计算出何时调用析构函数。因此,在声明新变量时为该特定 case 语句提供作用域或大括号很重要。

关于在 SWITCH 语句中的 DEFAULT 之后,CASE 中的 c++ 变量初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39679871/

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