C -在switch case中不执行default case

vlf7wbxs  于 2023-11-17  发布在  其他
关注(0)|答案(2)|浏览(128)

考虑这段C代码

#include <stdio.h>

enum
{
    ONE=1,
    THREE=3,
    SEVEN=7,
    FORTYTHREE=43,
    SIXTYFOUR=64,
    ONEHUNDREDSEVEN=107,
    TWOHUNDREDTHIRTEEN=213,     
    ONEHUNDREDSIXTYSEVEN=167,
    THREEHUNDREDNINETEEN=319,
    FIVEHUNDRED=500,
    ONETHOUSAND=1000,
    NINENINENINENINE=9999,
    MAX_VAL,
};

int main() {
    
    int x = ONE;
    int y = 0;
    switch (x)
    {
        case ONETHOUSAND:
            y = x;
            break;
        case FIVEHUNDRED:
            y = x;
            break;
        case FORTYTHREE:
            y = x;
            break;
        case SIXTYFOUR:
            y = x;
            break;
        case ONEHUNDREDSEVEN:
            y = x;
            break;
        case TWOHUNDREDTHIRTEEN:
            y = x;
            break;
        case ONEHUNDREDSIXTYSEVEN:
            y = x;
            break;
        case THREEHUNDREDNINETEEN:
            y = x;
            break;
        default:
            printf( "Hit default %d\n", x ); //How is this not executed?
        case ONE:
            y = x;
            printf("HERE!!!!\n");
            break;
        case THREE:
            y = x;
            break;
        case SEVEN:
            y = x;
            break;
    }

    return 0;
}

字符串
执行这段代码会得到HERE!!!!的输出。为什么default下的代码没有被执行,即使它明显地下降到下一个case
从我所看到的提到的,情况或默认值的顺序并不重要,那么为什么这段代码会这样呢?我在网上找不到任何关于这种行为的信息。

qlckcl4x

qlckcl4x1#

“Falling through”是指在满足case条件后,直接执行后的代码中没有break。然后,无论该条件是否满足,它都会继续执行case * 下面 * 的代码。通常,“falling through”被认为是要避免的不良和危险的编程实践。
default条件并不意味着“任何”条件,它意味着:任何 * 除了 * 其他明确提到的case条件。
作为一个旁注,即将到来的C23标准提供了一个属性[[fallthrough]],它可以用作自文档代码,以表明一个失败是故意的,让编译器警告其他一切。

vql8enpb

vql8enpb2#

正如n. m. could be an ai所说,default:的情况下不会执行,直到编译器没有检查所有的条件。我的意思是,即使你把default:放在所有情况的中间,这并不意味着它将在case THREEHUNDREDNINETEEN之后执行; * 这并不重要 *。
如果你想执行default,那么很明显,把xONE修改为开关中没有的东西(因为默认值意味着“如果没有其他情况满足,就执行这个”)。

相关问题