国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

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

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

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

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

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

前言

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

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

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

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

 

從字節(jié)碼出發(fā)

按照慣例,先寫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);
}

運行代碼,結(jié)果如下:

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

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

javac編譯和javap查看:

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

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

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

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

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

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

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

 

關(guān)于goto

goto:無條件跳轉(zhuǎn),goto 1表示跳轉(zhuǎn)到標號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");
}

重新編譯,再來看看字節(jié)碼。

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

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

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

 

switch和if區(qū)別

先用if實現(xiàn)上面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);
    }
}

編譯成字節(jié)碼:

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

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

 

結(jié)語

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

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

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

原文鏈接: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的環(huán)境時,出現(xiàn)了錯誤(mac git xcrun error active developer path)的解決辦法,希望對大家有所幫助...

    Swift教程網(wǎng)2232020-12-16
  • SwiftSwift中轉(zhuǎn)義閉包示例詳解

    Swift中轉(zhuǎn)義閉包示例詳解

    在Swift 中的閉包類似于結(jié)構(gòu)塊,并可以在任何地方調(diào)用,下面這篇文章主要給大家介紹了關(guān)于Swift中轉(zhuǎn)義閉包的相關(guān)資料,需要的朋友可以參考下...

    小小小_小朋友11412021-12-26
  • SwiftSwift的74個常用內(nèi)置函數(shù)介紹

    Swift的74個常用內(nèi)置函數(shù)介紹

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

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

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

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

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

    Swift教程之基礎數(shù)據(jù)類型詳解

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

    Swift教程網(wǎng)5162020-12-18
  • SwiftSwift使用CollectionView實現(xiàn)廣告欄滑動效果

    Swift使用CollectionView實現(xiàn)廣告欄滑動效果

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

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

    Swift能代替Objective-C嗎?

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

    Swift教程網(wǎng)4412020-12-16
  • SwiftSwift實現(xiàn)多個TableView側(cè)滑與切換效果

    Swift實現(xiàn)多個TableView側(cè)滑與切換效果

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

    乞力馬扎羅的雪雪5822021-01-08
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 欧美国产一区二区三区 | 免费看国产一级片 | 久久精品国产一区 | 91在线精品一区二区 | 欧美午夜精品久久久久久浪潮 | 最新毛片在线观看 | 韩日一区 | 国产精品久久久久久久久久东京 | 欧美日韩一区二区三区视频 | 黄色成人在线 | 亚洲成人中文字幕 | 伊大人久久香线焦宗合一75大 | 欧美午夜精品久久久 | 亚洲综合二区 | 黄免费| 久久国产福利 | 成人性生交大片免费网站 | 在线视频一区二区 | 视频一区在线观看 | 不卡一区| 国产精品一码二码三码在线 | 日韩精品一区二区在线观看 | 91午夜理伦私人影院 | av在线资源网 | 欧美综合在线观看 | 免费视频一区 | 中文字幕精品一区二区三区精品 | 成人久久久久久久 | 夜夜夜久久久 | 99久久久国产精品 | 电影在线观看免费 | 国产福利精品一区 | 视频一区二区三区中文字幕 | 成人一级黄色大片 | 中文字幕一区二区三区精彩视频 | 黑人精品 | 亚洲电影在线观看 | 综合久久av | 亚洲精品一区二区三区樱花 | 国产高清精品一区 | 黄色国产视频 |