package mainimport "fmt"func main() { var i int = 10 switch true { case i < 20: fmt.Printf("%v is less than 20\n", i) i = 100 fallthrough case i < 19: fmt.Printf("%v is less than 19\n", i) fallthrough case i < 18: fmt.Printf("%v is less than 18\n", i) fallthrough case i > 50: fmt.Printf("%v is greater than 50\n", i) fallthrough case i < 19: fmt.Printf("%v is less than 19\n", i) fallthrough case i == 100: fmt.Printf("%v is equal to 100\n", i) fallthrough case i < 17: fmt.Printf("%v is less than 17\n", i) }}輸出:10 is less than 20100 is less than 19100 is less than 18100 is greater than 50100 is less than 19100 is equal to 100100 is less than 17這是預期的行為嗎?
2 回答

臨摹微笑
TA貢獻1982條經驗 獲得超2個贊
該fallthrough
語句將控制權轉移到下一個case
塊的第一條語句。
該fallthrough
語句并不意味著繼續計算 next 的表達式case
,而是無條件地開始執行下一個case
塊。
引用fallthrough
聲明文檔:
“fallthrough”語句將控制轉移到表達式“switch”語句中下一個 case 子句的第一個語句。
引用switch
聲明文檔:
在 case 或 default 子句中,最后一個非空語句可能是(可能標記為)“fallthrough”語句,以指示控制應該從該子句的末尾流向下一個子句的第一個語句。否則控制流到“switch”語句的末尾。

慕森王
TA貢獻1777條經驗 獲得超3個贊
是的,正如 icza 所指出的那樣。
如果您不想在第一個 case 塊之后落入每個 case 塊,請刪除fallthrough
行(就像您不會break
在每個 C/C++ case 塊的末尾放置一行。
而且,正如您在評論中所期望的那樣,評估在switch()
達到時完成,之后無論您是否更改i
值,都不會在每個案例塊上再次評估。
- 2 回答
- 0 關注
- 167 瀏覽
添加回答
舉報
0/150
提交
取消