【问题标题】:Use of case without switch, please explain the output of this code使用不带开关的大小写,请解释这段代码的输出
【发布时间】:2021-05-15 01:45:52
【问题描述】:

我们使用带开关的案例。但是这里的情况是在默认情况下,所以它应该需要一个更多的开关。但是代码没有给出任何编译时错误。

#include<iostream>
int main()
{
    int num=4;
    while (num)
    {
        switch(num)
        {

            default:
                case 1:
                    std::cout<<"Executing "<<num<<"\n";
                
                case 2:
                
                case 3:
    
                break;
        }
        num--;          
    }
    return 0;
}

此外,输出是 Executing 4,然后是 Executing 1。根据我的说法,输出应该是 Executing 1,因为每次都输入默认值。当值为 1 时它将进入 case 1。但首先请解释这是如何编译的,因为根据我的说法应该有一个嵌套开关。

【问题讨论】:

  • 里面”?不,他们都在同一个领带上。 C++ 不关心你的缩进(不像python)。在switch 上方添加std::cout &lt;&lt; num &lt;&lt; '\n';,就会清楚发生了什么。
  • 误导性缩进。 default 和 case 1 处于同一级别。如果你不在案件之间休息,他们就会失败。因此 1 或 default= 任何不是 2 或 3 的东西都会打印出来。
  • 这只是错误的缩进。 cases 来自switch,它们与default 处于同一级别。
  • 我被困在这个问题上已经有一段时间了。非常感谢你们。

标签: c++ switch-statement


【解决方案1】:

switch 中,所有casedefault 都处于同一级别,您只是被(愚蠢的?)缩进所吸引,并且默认使用相当不一致。事实上它应该是:

    switch(num)
    {
            default:
            case 1:
                std::cout<<"Executing "<<num<<"\n";
            
            case 2:
            case 3:
                break;
    }

含义:如果为 2 或 3,则不执行任何操作(中断),并为 1 或任何其他值显示 Executing ...

这会做同样的事情,并且恕我直言更具可读性:

    switch(num)
    {
        case 2:
        case 3:
            break;

        default:
            std::cout<<"Executing "<<num<<"\n";
    }

【讨论】:

    【解决方案2】:

    case 1 到 3 缩进错误。

    这是所谓的“失败”。 如果开关命中default 案例,它将失败,直到它到达一个中断,这意味着它将在途中执行其他案例。
    在您的情况下,如果遇到default 情况,它将执行case 1case 2case 3

    编辑:我建议以break 结束每个案例,并将default 作为最后一个案例。 只有当你真的想通过并知道你在做什么时,你才能省略break

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-28
      • 1970-01-01
      • 2015-07-13
      • 2010-12-18
      • 2021-04-24
      • 2018-01-08
      相关资源
      最近更新 更多