打印
[其它产品/技术]

switch语句的工作原理

[复制链接]
楼主: LOVEEVER
手机看帖
扫描二维码
随时随地手机跟帖
21
zerorobert| | 2024-6-7 22:47 | 只看该作者 回帖奖励 |倒序浏览
switch语句会从上到下检查所有的case标签,看是否有与表达式的值相匹配的。一旦找到匹配的case标签,程序就会跳转到该标签后面的代码块执行。

使用特权

评论回复
22
yeates333| | 2024-6-8 10:38 | 只看该作者
如果找到了匹配的case标签,程序就会执行该标签后的代码块,直到遇到break语句或者switch语句的结束。如果没有找到匹配的case标签,程序会检查是否有default标签,如果有,就执行default标签后的代码块。

使用特权

评论回复
23
pmp| | 2024-6-8 14:20 | 只看该作者
当 switch 语句中的代码执行完毕后(无论是通过 break 语句还是自然结束),程序将继续执行 switch 语句之后的代码。

使用特权

评论回复
24
gygp| | 2024-6-8 18:30 | 只看该作者
break语句用于立即跳出switch语句,阻止继续执行后续的case。如果没有break,会发生所谓的“case穿透”(fall-through),即即使找到了匹配的case,也会继续执行后续的case代码,直到遇到break或switch语句结束。

使用特权

评论回复
25
primojones| | 2024-6-8 22:24 | 只看该作者
一旦找到匹配的case,将执行该case后的代码块,直到遇到break语句。

使用特权

评论回复
26
mmbs| | 2024-6-9 10:01 | 只看该作者
当遇到break语句或者switch语句结束时,程序会退出switch语句,继续执行后面的代码。

使用特权

评论回复
27
chenci2013| | 2024-6-9 17:26 | 只看该作者
在底层,switch语句的实现通常依赖于跳转表(jump table)这种数据结构。跳转表是一个数组,其中包含了指向各个case代码块的指针。程序运行时,会根据表达式的值直接跳转到对应的case代码块处执行,这种方式比顺序比较每个case更为高效。

使用特权

评论回复
28
loutin| | 2024-6-9 21:21 | 只看该作者
将计算出的值与每个case后的常量值进行比较。如果找到匹配,则执行与该case关联的代码块。

使用特权

评论回复
29
yangxiaor520| | 2024-6-10 09:15 | 只看该作者
switch不是一条一条往下判断

使用特权

评论回复
30
qiufengsd| | 2024-6-10 15:25 | 只看该作者
编译器在处理switch语句时,会根据case值的密集程度和范围来决定是否使用跳转表。若case值比较密集且连续,编译器更有可能生成跳转表;反之,如果case值稀疏或数量较多,编译器可能选择其他方法来实现switch语句。

使用特权

评论回复
31
gouguoccc| | 2024-6-10 17:42 | 只看该作者
switch的代码可读性更好

使用特权

评论回复
32
macpherson| | 2024-6-10 19:11 | 只看该作者
switch语句中的case标签必须是常量表达式,不能是变量或其他复杂的表达式。此外,case标签的值必须是唯一的,不能有重复。

使用特权

评论回复
33
wengh2016| | 2024-6-10 23:03 | 只看该作者
首先,switch语句会对一个表达式进行求值。
然后,将这个表达式的值与case关键字后面的常量表达式值进行比较。
如果表达式的值与某个case后面的常量表达式值相等,则执行该case块中的代码。
如果找到匹配的case后,switch语句会执行该case块中的代码,然后跳过剩余的case和default块。
如果表达式的值与所有case后的常量表达式都不匹配,则会执行default块中的代码(如果存在的话)。default块是可选的,如果未指定,则在找不到匹配的case时将不执行任何操作。

使用特权

评论回复
34
modesty3jonah| | 2024-6-11 13:32 | 只看该作者
在switch语句中,每个case代码段的末尾通常会有一个break语句。这个break用于跳出当前switch结构,防止代码执行流进入下一个case代码段。如果省略了break,程序将继续执行下一个case中的语句,直到遇到break或switch语句结束。

使用特权

评论回复
35
robertesth| | 2024-6-11 17:01 | 只看该作者
计算出的表达式值会与各个case标签后的常量值进行比较。这些case标签后面跟着的常量值必须是整数、字符或枚举值,并且在同一个switch语句中必须是唯一的

使用特权

评论回复
36
biechedan| | 2024-6-11 20:41 | 只看该作者
计算表达式:首先,计算switch语句中的表达式,得到一个值。
比较值:然后,将这个值与每个case标签后面的常量值进行比较。
执行代码块:如果找到与表达式值匹配的case标签,则执行该case标签后面的代码块,直到遇到break语句或者switch语句结束。如果没有找到匹配的case标签,且存在default标签,则执行default标签后面的代码块。

使用特权

评论回复
37
adolphcocker| | 2024-6-12 10:27 | 只看该作者
程序会尝试将表达式的值与 switch 语句中每个 case 标签后面的值进行匹配。这些值必须是常量表达式,并且在编译时已知。如果找到了匹配的值,那么程序将执行从该 case 标签开始直到下一个 break 语句(如果有的话)或 switch 语句结束的代码。

使用特权

评论回复
38
updownq| | 2024-6-12 13:54 | 只看该作者
switch语句会计算括号中的表达式,并将结果存储在一个临时的位置。这个表达式的结果通常是一个整数或枚举类型,但也可以是字符类型。

使用特权

评论回复
39
chenci2013| | 2024-6-12 17:29 | 只看该作者
当程序遇到switch语句时,它会取表达式的值,并与每个case后的常量进行比较。一旦找到匹配项,程序就会执行该case后的代码块。如果没有找到匹配的case,且存在default标签,则执行default下的代码块。

使用特权

评论回复
40
suncat0504| | 2024-6-14 08:58 | 只看该作者
不同语言的SWITCH有不同的表现形式。个人觉得switch就是if ... else if ... else 的变种,需要注意的是要配合break。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则