最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2021年06月29日 09:19:21   作者:叫我阿柒啊  
很多朋友糾結(jié)為什么為什么switch里的case沒有break不行呢?break這么重要么,今天小編就給大家普及下這方便的知識,感興趣的朋友一起看看吧

前言

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

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

小姐姐接著問我為什么,我說少個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);
  }

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

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

javac編譯和javap查看:

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

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

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

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

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

關(guān)于goto

goto:無條件跳轉(zhuǎn),goto 1表示跳轉(zhuǎn)到標(biāo)號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é)碼。

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

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

switch和if區(qū)別

先用if實(shí)現(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é)碼:

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

結(jié)語

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

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

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

相關(guān)文章

  • Swift實(shí)現(xiàn)倒計(jì)時5秒功能

    Swift實(shí)現(xiàn)倒計(jì)時5秒功能

    這篇文章主要為大家詳細(xì)介紹了Swift實(shí)現(xiàn)倒計(jì)時5秒功能,在“登錄”和“注冊”頁面也有相似功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • Swift HTTP加載請求Loading Requests教程

    Swift HTTP加載請求Loading Requests教程

    這篇文章主要為大家介紹了Swift HTTP加載請求Loading Requests教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Swift中的HTTP模擬測試示例詳解

    Swift中的HTTP模擬測試示例詳解

    這篇文章主要為大家介紹了Swift中的HTTP模擬測試示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Swift學(xué)習(xí)教程之訪問控制詳解

    Swift學(xué)習(xí)教程之訪問控制詳解

    訪問控制可以限定你在源文件或模塊中訪問代碼的級別,也就是說可以控制哪些代碼你可以訪問,哪些代碼你不能訪問。下面這篇文章主要給大家介紹了關(guān)于Swift學(xué)習(xí)教程之訪問控制的相關(guān)資料,需要的朋友可以參考下。
    2017-08-08
  • iOS Swift讀取本地json文件報(bào)錯的解決方法

    iOS Swift讀取本地json文件報(bào)錯的解決方法

    只要是app開發(fā)者都知道,從服務(wù)器端獲得的數(shù)據(jù)要不就是json格式的數(shù)據(jù),要么就是xml格式的數(shù)據(jù),而這篇文章主要給大家介紹了關(guān)于iOS Swift讀取本地json文件報(bào)錯的解決方法,需要的朋友可以參考借鑒,下面來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • swift控件工廠類的實(shí)現(xiàn)代碼

    swift控件工廠類的實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了swift控件工廠類的實(shí)現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Swift教程之基礎(chǔ)數(shù)據(jù)類型詳解

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

    這篇文章主要介紹了Swift教程之基礎(chǔ)數(shù)據(jù)類型詳解,本文詳細(xì)講解了Swift中的基本數(shù)據(jù)類型和基本語法,例如常量和變量、注釋、分號、整數(shù)、數(shù)值類型轉(zhuǎn)換等內(nèi)容,需要的朋友可以參考下
    2015-01-01
  • Swift進(jìn)階教程Mirror反射示例詳解

    Swift進(jìn)階教程Mirror反射示例詳解

    這篇文章主要為大家介紹了Swift進(jìn)階教程Mirror反射示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Swift學(xué)習(xí)筆記之構(gòu)造器重載

    Swift學(xué)習(xí)筆記之構(gòu)造器重載

    Swift 將為所有屬性已提供默認(rèn)值的且自身沒有定義任何構(gòu)造器的結(jié)構(gòu)體或基類,提供一個默認(rèn)的構(gòu)造器。這個默認(rèn)構(gòu)造器將簡單的創(chuàng)建一個所有屬性值都設(shè)置為默認(rèn)值的實(shí)例。
    2014-11-11
  • 詳談swift內(nèi)存管理中的引用計(jì)數(shù)

    詳談swift內(nèi)存管理中的引用計(jì)數(shù)

    下面小編就為大家?guī)硪黄斦剆wift內(nèi)存管理中的引用計(jì)數(shù)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09

最新評論

大埔县| 玉环县| 武义县| 中超| 永嘉县| 桂平市| 聂荣县| 肃南| 鄂尔多斯市| 泸定县| 华容县| 钟祥市| 广宁县| 饶河县| 吉安市| 泰顺县| 宜兰县| 岳池县| 逊克县| 合水县| 恩施市| 聊城市| 怀柔区| 易门县| 武城县| 乃东县| 翁源县| 江华| 资源县| 张家港市| 葵青区| 望城县| 刚察县| 于都县| 宜君县| 南通市| 德阳市| 万荣县| 孝感市| 灵川县| 从江县|