考虑这段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
?
从我所看到的提到的,情况或默认值的顺序并不重要,那么为什么这段代码会这样呢?我在网上找不到任何关于这种行为的信息。
2条答案
按热度按时间qlckcl4x1#
“Falling through”是指在满足
case
条件后,直接执行后的代码中没有break
。然后,无论该条件是否满足,它都会继续执行case
* 下面 * 的代码。通常,“falling through”被认为是要避免的不良和危险的编程实践。default
条件并不意味着“任何”条件,它意味着:任何 * 除了 * 其他明确提到的case
条件。作为一个旁注,即将到来的C23标准提供了一个属性
[[fallthrough]]
,它可以用作自文档代码,以表明一个失败是故意的,让编译器警告其他一切。vql8enpb2#
正如
n. m. could be an ai
所说,default:
的情况下不会执行,直到编译器没有检查所有的条件。我的意思是,即使你把default:
放在所有情况的中间,这并不意味着它将在case THREEHUNDREDNINETEEN
之后执行; * 这并不重要 *。如果你想执行
default
,那么很明显,把x
从ONE
修改为开关中没有的东西(因为默认值意味着“如果没有其他情况满足,就执行这个”)。