【问题标题】:Execution of default: in switch-case selection statements in C++ [duplicate]执行默认值:在 C++ 中的 switch-case 选择语句中 [重复]
【发布时间】:2018-02-16 20:28:42
【问题描述】:

我的代码:-

#include <iostream>

using namespace std;

int main()
{
    int b=10;
    switch(b)
    {
    case 40:
        cout<<"no";
    default:
        cout<<"yes";
    case 10:
        cout<<"done";
    }
    return 0;
}

我只是在试验我的代码并尝试了这种情况。我曾期望输出是:-

是的

但输出是:-

完成

据我所知,由于编译器在读取default: 语句时不知道case 10:,因此它还必须执行其中的内容。

我的问题:-

i) 编译器何时执行default: 案例,因此为什么输出是

完成

而不是

是的

感谢您的帮助。

P.S :- 我正在使用带有 GCC 编译器的 Code::Blocks。

【问题讨论】:

  • "据我所知,默认情况的行为类似于 if-else 选择语句中的 else。" 不,它没有。 default 在开关中的位置并不重要,与其他任何情况一样。
  • " 因为编译器不知道 case 10:" 哦,它肯定知道。
  • 我看不出这是怎么复制的。
  • 编译器不会只读取您的代码一次并一次性解释所有内容。来自cppref:“如果条件的计算结果等于常量表达式之一的值,则控制权将转移到标有该常量表达式的语句。”

标签: c++


【解决方案1】:

您的程序会跳转到第一个匹配的case

只有在没有找到时才会跳转到 default

[C++14: 6.4.2/5]:switch 语句被执行时,它的条件被评估并与每个case 常量进行比较。 如果 case 常量之一等于条件的值,则将控制权传递给匹配的 case 标签后面的语句。 如果没有 case 常量与条件匹配,并且存在 default标签,控制传递给由默认标签标记的语句。如果没有大小写匹配并且没有default,则不会执行 switch 中的任何语句。

当你发现自己将switch 视为“一种if 声明”时,请立即停止。

据我所知,由于编译器在读取default: 语句时不知道case 10:,因此它还必须执行其中的内容。

这不是 C++ 的工作方式;它(有点)比那更聪明。

【讨论】:

  • " 它(有点)比那更聪明 " HURR DURR 这对我来说看起来像是一个函数,而不是一个构造函数调用。
  • @RickAstley:?
  • @RickAstley:记住,用 C++ 拼写“构造函数调用”是不可能的。当你认为你有,你没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-15
  • 1970-01-01
  • 1970-01-01
  • 2015-07-16
  • 2014-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多