国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

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

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

[[412376]]

 前言

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

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

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

 從字節碼出發

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

  1. public static void main(String[] args) {  
  2.    int i = 0 
  3.    switch (i) {  
  4.        case 0:  
  5.            System.out.println(0);  
  6.        case 1:  
  7.            System.out.println(1);  
  8.        case 2:  
  9.            System.out.println(2);  
  10.  } 

運行代碼,結果如下:

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

javac編譯和javap查看:

「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后代碼也無法執行。那怎么辦嘞.... 

關于goto

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

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

  1. public static void main(String[] args) {  
  2.     int i = 0 
  3.     switch (i) {  
  4.         case 0:  
  5.             System.out.println(0);  
  6.             break;  
  7.         case 10:  
  8.             System.out.println(1);  
  9.             break;  
  10.         case 2:  
  11.             System.out.println(2);  
  12.             break;  
  13.     }  
  14.     System.out.println("Hello World");  

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

如圖,與第一次的字節碼相比,在標號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邏輯。 

  1. public static void main(String[] args) {  
  2.     int i = 0 
  3.     if (i == 0) {  
  4.         System.out.println(0);  
  5.     } else if (i == 1) {  
  6.         System.out.println(1);  
  7.     } else if (i == 2) {  
  8.         System.out.println(2);  
  9.     }  

編譯成字節碼:

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

結語

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

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

 

責任編輯:龐桂玉 來源: Hollis
相關推薦

2020-07-16 15:20:13

switch...caif...else語言

2023-06-26 07:31:29

中文編程編碼

2021-04-05 14:47:05

裝飾器Python代碼

2013-01-22 09:35:27

Hadoop存儲

2009-06-08 21:45:46

Javaswitch-case

2009-08-19 10:41:14

C# switch和c

2011-05-25 14:59:35

if elseswitch case

2021-05-08 08:55:54

CPUIBMIntel

2017-01-13 23:06:45

swiftios

2020-10-09 06:48:19

Pythonswitch語句

2022-06-12 21:36:57

Hooksreact

2011-07-21 11:11:10

Scrum

2015-08-06 10:19:19

編程腦子

2021-04-20 19:23:07

語法switch-casePython

2020-07-22 07:55:12

Python開發函數

2021-01-20 12:43:07

編程語言Java

2021-01-20 12:44:22

JAVA編程語言軟件

2019-08-15 16:48:30

2010-02-02 17:20:44

C++ switch-

2022-12-01 08:15:41

CGOswitcherror
點贊
收藏

51CTO技術棧公眾號

六月婷婷一区| 日韩欧美黄色影院| avav在线播放| 好吊一区二区三区| 国产第一区电影| 韩国三级大全久久网站| 欧美一区二区精品在线| 欧美在线一卡| 婷婷亚洲久悠悠色悠在线播放 | 欧美一区免费视频| 午夜精品国产| 亚洲一区二区久久久久久| 精品中国亚洲| 97视频在线观看网址| 国产精品一区二区三区av| 在线播放日韩精品| 久久不卡日韩美女| 欧美成人激情图片网| 欧美国产中文高清| 韩国视频理论视频久久| 亚洲一区二区三区日本久久九| 国产午夜精品一区二区三区| av日韩电影| 日韩一二三在线视频播| 亚洲国产伊人| 九九热精品在线| 精品一区二区三区中文字幕 | 中出在线观看| 亚洲va韩国va欧美va| av在线不卡播放| 精品免费在线视频| 国产在线资源| 91精品国产91久久综合桃花 | 色阁综合av| 国产成人欧美日韩在线电影| 中文字幕精品在线播放| 国产69精品久久久久毛片| 777精品久无码人妻蜜桃| 成人国产精品免费观看| 国产精品无码av无码| 亚洲欧洲精品一区二区三区 | 久久免费电影网| 蜜桃视频免费网站| 欧美图片一区二区三区| 一级日本在线| 一区二区亚洲欧洲国产日韩| 成人av综合网| 豆国产97在线| 高清不卡一区二区| av网站免费在线| 欧美婷婷六月丁香综合色| 1234区中文字幕在线观看| 久久天天躁狠狠躁夜夜av| 日韩国产专区| 日韩国产一区久久| www.欧美日韩国产在线| 嫩草影院发布页| 欧美一区二区在线免费播放| 素人啪啪色综合| 国产拍精品一二三| 韩国av一区二区三区在线观看| 久久久精品三级| 精品视频在线免费观看| 色综合久久久| 亚洲一区免费网站| 国产一区二区三区免费在线观看| 91日韩视频在线观看| 在线精品视频免费播放| av有声小说一区二区三区| 国产精品极品尤物在线观看| 麻豆国产一区二区| 国产美女特级嫩嫩嫩bbb片| 欧美一区二区三区婷婷月色| 日本免费精品| 国产一区二区三区色淫影院| 久久欧美一区二区| 中文字幕日本在线观看| 欧美伦理91i| 亚洲欧美日本视频在线观看| 天天干天天玩天天操| 日韩一区二区中文字幕| 免费成人蒂法| 免费看污污视频| 欧美性高清videossexo| 一区二区视频| 在线不卡视频一区二区| 日韩欧美大尺度| 51精品国产| 无码毛片aaa在线| 欧美综合在线视频| 免费看久久久| 国产精品一色哟哟| 777xxx欧美| 欧美丝袜丝交足nylons172| 久久亚洲a v| 制服.丝袜.亚洲.另类.中文| 91精品入口| 97av中文字幕| 欧美一级艳片视频免费观看| jizzjizz欧美69巨大| 日韩欧美一区二| 欧美成人在线直播| 中文久久电影小说| 欧美视频在线第一页| 日韩欧美国产三级电影视频| 91综合在线| 好紧好硬好湿我太爽了| 久久久精品久久| 高清国产午夜精品久久久久久| 呦呦在线视频| 美日韩免费视频| 欧美午夜美女看片| 国产一区二区精品福利地址| 精品久久久噜噜噜噜久久图片| 亚洲欧洲美洲在线综合| 久久一区亚洲| 国产区在线观看| 麻豆亚洲一区| 7777精品伊人久久久大香线蕉| 亚洲色图插插| 日本私人网站在线观看| 国产精品稀缺呦系列在线| 亚洲人123区| 天天躁日日躁狠狠躁欧美巨大小说| 337p粉嫩大胆噜噜噜鲁| 深夜福利国产精品| 91在线视频免费91| 精品午夜视频| www亚洲成人| 欧美性在线视频| 亚洲视频在线一区观看| 日韩精品丝袜美腿| 天堂av免费观看| 成人国产精品av| 欧美日韩一区在线观看| 国产日韩视频| 国产三级伦理在线| 同性恋视频一区| 日韩深夜视频| 日韩高清在线播放| 久久精品国产网站| www在线看| 一本—道久久a久久精品蜜桃| 3d动漫精品啪啪一区二区竹菊| 你懂的国产精品| 国产一级二级三级在线观看| 亚洲xxxx3d| 欧美三电影在线| 首页国产欧美日韩丝袜| 国产美女高潮在线观看| 肉大捧一出免费观看网站在线播放| 亚洲国产精品人久久电影| 国产专区综合网| 亚洲伊人精品酒店| 99色在线播放| 亚洲精品欧美一区二区三区| 欧美日韩一区二区三区四区| 久久综合伊人| 天堂久久一区| 白白色视频在线| 蜜桃视频成人| 人人狠狠综合久久亚洲婷| av最新地址| 国产91社区| 亚洲第一天堂无码专区| 99久久er热在这里只有精品15 | 波多野结衣在线一区二区| 骚视频在线观看| 久久久久久久久久久一区| 日韩电影在线观看中文字幕 | 欧美精美视频| 午夜毛片在线| 日韩亚洲欧美一区二区| 欧美成人精品h版在线观看| 午夜a成v人精品| 日韩中文字幕av电影| 精品国产伦一区二区三区观看说明| 无套内精的网站| 免费成人在线观看av| 久久国产精品电影| 欧美亚洲国产一区在线观看网站| 日本怡春院一区二区| 成人福利一区| 免费高清完整在线观看| 99福利在线观看| 国产成人免费电影| 另类美女黄大片| 欧美日韩黄色一区二区| 国产一区福利在线| 91亚洲人成网污www| 欧美性理论片在线观看片免费| yy4480电影网| 亚洲国产一区二区精品视频| 欧美精品www| 精品欧美黑人一区二区三区| 中文字幕在线观看一区二区| 毛片一区二区三区| 日韩夫妻性生活xx| 成人国产精品久久| 污网站在线免费看|