为了账号安全,请及时绑定邮箱和手机立即绑定

switch 语句中falltrough 的行为

switch 语句中falltrough 的行为

Go
FFIVE 2021-10-18 14:53:30
我正在阅读本书中关于 Go 中 switch 语句的部分。但是这个例子让我感到困惑: package main import "fmt" func main() { k := 6 switch k {    case 4: fmt.Println("was <= 4"); fallthrough;    case 5: fmt.Println("was <= 5"); fallthrough;    case 6: fmt.Println("was <= 6"); fallthrough;    case 7: fmt.Println("was <= 7"); fallthrough;    case 8: fmt.Println("was <= 8"); fallthrough;    default: fmt.Println("default case")     }}输出是:was <= 6was <= 7was <= 8default case并且书中指出:使用 fallthrough 语句来指示必须执行当前块之后的 case 块。现在我要提问:为什么 Go 默认比较,在这种情况下 k 较低?文中提到执行以下情况。美好的。但是为什么他们不只执行与 k 匹配的案例?
查看完整描述

1 回答

?
烙印99

TA贡献1829条经验 获得超13个赞


在表达式 switch 中,对 switch 表达式求值,而不必为常量的 case 表达式从左到右和从上到下求值;第一个等于 switch 表达式的语句触发相关 case 语句的执行;其他情况被跳过。如果没有 case 匹配并且存在“默认” case,则执行其语句。最多可以有一个默认情况,它可能出现在“switch”语句中的任何位置。缺少 switch 表达式等效于布尔值 true。


ExprSwitchStmt = "switch" [ SimpleStmt ";" ] [ Expression ] "{" { ExprCaseClause } "}" .

ExprCaseClause = ExprSwitchCase ":" StatementList .

ExprSwitchCase = "case" ExpressionList | "default" .

在 case 或 default 子句中,最后一个非空语句可能是(可能标记为)“fallthrough”语句,以指示控制应从该子句的末尾流向下一个子句的第一个语句。否则控制流到“switch”语句的末尾。“fallthrough”语句可能作为表达式 switch 的最后一个子句以外的所有语句的最后一个语句出现。


表达式前面可能有一个简单的语句,该语句在计算表达式之前执行。


从上到下评估 case 表达式。case 4并且case 5是false,case 6是true。case 7,case 8和default是false但流入通过下一级条款执行fallthrough。


查看完整回答
反对 回复 2021-10-18
  • 1 回答
  • 0 关注
  • 511 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信