一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Swift - 為什么switch里的case沒有break不行

為什么switch里的case沒有break不行

2021-12-23 15:29叫我阿柒啊 Swift

很多朋友糾結為什么為什么switch里的case沒有break不行呢?break這么重要么,今天小編就給大家普及下這方便的知識,感興趣的朋友一起看看吧

前言

一個小姐姐拿著一個switch的選擇題來問我。

為什么switch里的case沒有break不行

之所以這么篤定地回答這個問題,并不是我知道其中原理,而是之前在一個群里,有人問了同類型的問題,我瞥了一眼記住了答案,所以才依葫蘆畫瓢。

小姐姐接著問我為什么,我說少個break,但凡再問一句:為什么少個break結果就不一樣,我就回答不出來了。所以,為了將尷尬扼殺于搖籃,還是研究一下break在switch的作用。

 

從字節碼出發

按照慣例,先寫demo表述問題。

public static void main(String[] args) {
  int i = 0;
  switch (i) {
      case 0:
          System.out.println(0);
      case 1:
          System.out.println(1);
      case 2:
          System.out.println(2);
}

運行代碼,結果如下:

為什么switch里的case沒有break不行

*明明只匹配了case 0,為什么1和2也執行了? 很費解!按照慣用套路,看看字節碼能不能給個答案。

javac編譯和javap查看:

為什么switch里的case沒有break不行

tableswitch和lookupswitch都用于switch條件跳轉,前者用于case值連續,例如上面代碼中的0、1、2;后者用于case值不連續。

從字節碼可以看出:switch中的case條件和對應代碼塊是分開的。如上圖,case為0時,跳轉到標號28代碼處;為1時跳轉到標號35代碼處;為2時跳轉到標號43代碼處;default則跳轉到標號49代碼處。

這不,答案就出來了,當case 0匹配了之后,直接跳轉到標號28代碼處開始執行,輸出0,然后策馬奔騰,一路小下坡,順序執行完后面所有代碼,直到標號49 return,方法完執行完成,程序結束。

如果按照正常的思維,是不是case 0匹配之后,跳到28,執行完28、31、32輸出0之后,就應該直接跳走,直接執行49。那么,這個"跳走”用字節碼應該怎么表示?

用return?那不行,因為return會結束方法,這樣switch后代碼也無法執行。那怎么辦嘞....

為什么switch里的case沒有break不行

 

關于goto

goto:無條件跳轉,goto 1表示跳轉到標號1的代碼處。

再寫代碼樣例,這次在代碼中給每個case都加上break。

public static void main(String[] args) {
    int i = 0;
    switch (i) {
        case 0:
            System.out.println(0);
            break;
        case 10:
            System.out.println(1);
            break;
        case 2:
            System.out.println(2);
            break;
    }
    System.out.println("Hello World");
}

重新編譯,再來看看字節碼。

為什么switch里的case沒有break不行

如圖,與第一次的字節碼相比,在標號35、45都有了goto指令。如果case 0匹配成功,則跳到標號28執行,執行完代碼塊對應的31、32指令之后,執行35的goto指令跳轉到標號55,這樣就跳出了switch作用范圍,case 1和2也不會被執行。

等等,怎么少了一個goto,在標號55的上方應該還有一個goto才對!其實這就涉及到了編譯器優化技術,最后一個goto也是跳轉到標號55的指令,但沒有goto下一步也一樣順序執行此行指令,所以這個goto被編譯器視為無用代碼進行了消除。

 

switch和if區別

先用if實現上面switch邏輯。

public static void main(String[] args) {
    int i = 0;
    if (i == 0) {
        System.out.println(0);
    } else if (i == 1) {
        System.out.println(1);
    } else if (i == 2) {
        System.out.println(2);
    }
}

編譯成字節碼:

為什么switch里的case沒有break不行

if_icmpne用于比較兩個int數。從字節碼也可以看出if和switch的區別:if條件和代碼塊的字節碼是順序的,switch條件和代碼塊是分開的;if自動生成goto指令,switch只有加了break才生成goto指令

 

結語

case中的break告訴前端編譯器:給每個case對應代碼塊的最后加上goto。這樣,執行完匹配上的代碼之后,就可以略過后面的case代碼塊了。

果然,求(xiao)知(jie)欲(jie)才是學習新知識的動力。

到此這篇關于為什么switch里的case沒有break不行的文章就介紹到這了,更多相關switch case break內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.cnblogs.com/seven0007/p/switch.html

延伸 · 閱讀

精彩推薦
  • Swiftmac git xcrun error active developer path 錯誤

    mac git xcrun error active developer path 錯誤

    本文主要是講訴了如何解決在mac下使用git;xcode4.6的環境時,出現了錯誤(mac git xcrun error active developer path)的解決辦法,希望對大家有所幫助...

    Swift教程網2232020-12-16
  • SwiftSwift中轉義閉包示例詳解

    Swift中轉義閉包示例詳解

    在Swift 中的閉包類似于結構塊,并可以在任何地方調用,下面這篇文章主要給大家介紹了關于Swift中轉義閉包的相關資料,需要的朋友可以參考下...

    小小小_小朋友11412021-12-26
  • SwiftSwift的74個常用內置函數介紹

    Swift的74個常用內置函數介紹

    這篇文章主要介紹了Swift的74個常用內置函數介紹,這篇文章列舉出了所有的Swift庫函數,內置函數是指無需引入任何模塊即可以直接使用的函數,需要的朋友可...

    Swift教程網5802020-12-19
  • Swiftswift where與匹配模式的實例詳解

    swift where與匹配模式的實例詳解

    這篇文章主要介紹了swift where與匹配模式的實例詳解的相關資料,這里附有簡單的示例代碼,講的比較清楚,需要的朋友可以參考下...

    追到夢的魔術師14382021-01-06
  • SwiftSwift教程之基礎數據類型詳解

    Swift教程之基礎數據類型詳解

    這篇文章主要介紹了Swift教程之基礎數據類型詳解,本文詳細講解了Swift中的基本數據類型和基本語法,例如常量和變量、注釋、分號、整數、數值類型轉換等...

    Swift教程網5162020-12-18
  • SwiftSwift使用CollectionView實現廣告欄滑動效果

    Swift使用CollectionView實現廣告欄滑動效果

    這篇文章主要為大家詳細介紹了Swift使用CollectionView實現廣告欄滑動效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Stevin的技術博客12372021-01-13
  • SwiftSwift能代替Objective-C嗎?

    Swift能代替Objective-C嗎?

    這是我在網上上看到的答案,復制粘貼過來和大家分享一下,因為我和很多人一樣很關心Swift的出現對Mac開發的影響和對Objective-C的影響。...

    Swift教程網4412020-12-16
  • SwiftSwift實現多個TableView側滑與切換效果

    Swift實現多個TableView側滑與切換效果

    這篇文章主要為大家詳細介紹了Swift實現多個TableView側滑與切換效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    乞力馬扎羅的雪雪5822021-01-08
主站蜘蛛池模板: 波多野结衣中文丝袜字幕 | haodiaose在线精品免费观看 | 国产成人毛片 | 俄罗斯妈妈235 | 色噜噜 男人的天堂在线观看 | 欧美第十页 | 黄 色 成 年人在线 幻女free性俄罗斯第一次摘花 | 我被黄总征服的全过程 | 2020国产精品亚洲综合网 | 国产香蕉一区二区在线网站 | 日韩精品中文字幕视频一区 | haodiaocao几万部精彩视频 | 欧美日本一道高清免费3区 欧美人做人爱a全程免费 | 亚洲乱码一区二区三区国产精品 | 天美传媒影视在线免费观看 | 亚洲高清网站 | 国模人体aⅴ | 国产在线xvideos | 欧美日韩国产超高清免费看片 | 2019国内自拍大神视频 | 日本免费高清在线观看播放 | 国产色网 | nxgx国产 | a级情欲片在线观看hd | 国产精品免费 | 2021麻豆剧果冻传媒入口永久 | 91精品国产品国语在线不卡 | 亚洲视频中文字幕 | boobsmilking流奶水野战 | 短篇艳妇系列 | 国产福利一区二区三区 | 视频免费 | 男插女的下面免费视频夜色 | 日本免费高清在线观看播放 | 国产精品久久久久久福利 | 99久热只有精品视频免费观看17 | 男人使劲躁女人小视频 | 国产成人综合亚洲亚洲欧美 | 欧美日韩精品在线视频 | 韩国美女激情vip | 亚洲人成在线观看一区二区 |