为什么C ++在switch语句中需要中断?

这个问题在这里已经有了答案:

  • 切换声明Fallthrough ...应该允许吗? [已关闭] 12个回答

  • 这是为了“跌宕起伏”的情况:

    switch (x)
    {
        case 0:
        case 1:
            std::cout << "x is 0 or 1." << std::endl;
            break;
    }
    

    在这个例子中,如果x是0或1,case语句被执行。


    这是因为switch val会被转换为程序集跳转到特定地址case (some value):是,那么CPU将继续正常执行代码,因此要获取下一个地址并继续,然后取下并继续, case块在内存中的连续地址中,因此执行将会通过。 break; 会告诉CPU再次跳转,这次超出switch-case块不会执行任何更多case

    通过跌倒可能是受益人,并且在一些更新的语言中,您必须明确地说您想要它,在C和C ++中,通过是隐含的。

    来自我的机器的示例:

    int i=1;
    switch (i) {
    case 1:
            i=5;
            break;
    default:
            i=6;
    }
    return 0;
    

    会变成

    0x100000eeb:  movl   $0x1, -0x8(%rbp) ;int i=1;
    0x100000ef2:  xorl   %eax, %eax
    0x100000ef4:  movb   %al, %cl
    0x100000ef6:  testb  %cl, %cl         ;switch(i)
    0x100000ef8:  jne    0x100000f0f      ;i is not 1 go to default:
    0x100000efe:  jmp    0x100000f03      ;i is 1 go to case 1:
    0x100000f03:  movl   $0x5, -0x8(%rbp) ;case 1: i=5;
    0x100000f0a:  jmp    0x100000f16      ;break;
    0x100000f0f:  movl   $0x6, -0x8(%rbp) ;default: i=6;
    0x100000f16:  movl   $0x0, %eax       ;first instruction after switch-case
    

    如果在i=5;之后没有跳转i=5; 那么CPU将执行default:


    因为行为是从C继承而来的,C使用了明确的break 。 开关贯穿性更有用,这就是为什么它被选为“默认”行为的原因。

    只有更多的程序员时间和更少的机器时间,所以设计最大潜在效率而不是可读性更有意义。 编译器在很多方面优化功耗要低很多(在许多方面)。 您可以查看Duff's Device之类的内容,以了解如何使用此行为。

    链接地址: http://www.djcxy.com/p/84475.html

    上一篇: Why does C++ require breaks in switch statements?

    下一篇: Switch statement behavior in C++