咱們在進行Java開發的時候,常常會用到循環結構,可是有幾個關於循環的「冷門」知識點,不知道你是否是都已經掌握了呢?咱們一塊兒來看看html
咱們都知道,若是每次循環過程當中要執行的語句只有一條,那麼就能夠不用寫大括號。但事實真的如此嗎?請看下面的代碼:
你們能夠看到,在循環中只有一條語句,可是並不能經過語法編譯。這是爲何呢?由於Java語言規定:循環語句中重複執行的語句不能是一條單獨的局部變量定義語句。這裏所說的「定義局部變量語句」也能夠指建立對象的語句,例如如下代碼也不能經過編譯:
同時,這個規律還能夠延伸到條件語句,也就是說,if語句中也不能只有一條單獨的局部變量定義語句,例如如下代碼:
若是咱們在以上三段代碼中,給循環或條件語句都添加了大括號,語法錯誤天然就消失了:編程
咱們平時定義的循環每每只有一個循環變量
例如在這個循環中,變量i就是一個循環變量。可是,若是開發過程當中,須要咱們在一個循環中定義並操做多個循環變量該怎麼辦呢?這時候,咱們能夠把多個循環變量的定義語句用逗號隔開,而且對循環變量的操做語句也用逗號隔開就能夠了。咱們以定義並操做兩個循環變量爲例做爲示範,請看如下代碼:
須要說明的是:for循環結構只能有兩個分號(;),而且明確規定第一個分號前面的部分是用來定義並初始化循環變量的。咱們知道,一個分號其實就表示一條語句的結束。因此說,第一個分號前面定義並初始化循環變量的語句只能有一條。既然只能有一條語句來定義循環變量,那麼若是須要定義多個循環變量的話,這些循環變量只能同屬一種類型,由於多種類型的循環變量必需要用多條語句來定義。若是實在須要定義多個類型不相同的循環變量,咱們能夠乾脆在循環語句以前就把這些變量都定義好。ide
咱們一般都會把循環變量定義爲整數類型,若是把循環變量定義爲浮點數能夠嗎?咱們來作個實驗,請看如下代碼
這段代碼想必你們都能看懂,那麼這段代碼可否正常執行呢?答案是沒問題,它的執行效果以下:
不少人經過這個實驗就下定結論認爲以浮點數做爲循環變量沒有什麼問題,可是咱們必須清楚:當一個浮點數大到必定程度的時候,就會致使精度的丟失,從而出現一些奇怪的錯誤。好比,咱們把上面代碼中start變量的初始值改爲999999999;在這種狀況下,從新運行程序,你會發現程序沒有任何輸出。爲何沒有任何輸出呢?變量f的初始值是start,而浮點數大到必定程度的時候,由於丟失了精度,會致使虛擬機錯誤的覺得」f」與」start+5」的值是相同的,因此」f<start+5」並不成立,所以循環一次都不執行。
可是,若是咱們把循環條件從」 f<start+5」改爲」f<start+50」,這個循環又會變成無限循環(死循環),爲何呢?就是由於, f的初始值很大,它會被保存爲」1.0E9」。而執行了」f++」以後,因爲精度的丟失,f的值仍然被保存爲」1.0E9」,跟循環以前沒有任何變化,因此循環條件老是成立的,所以循環才變成了死循環。
咱們經過這個例子想告訴你們:若是沒有十分的必要,不要使用浮點數做爲循環變量,即便非要用浮點數充當循環變量,也必定要注意數值範圍不能太大,不然會由於精度丟失而出現一些奇怪的現象。學習
咱們都知道,在Java語言中,有兩個可以控制循環執行的關鍵字,分別是break和continue。一般狀況下,這兩個關鍵字所控制的都是本層循環的執行,並不能控制到外層循環。但若是咱們但願經過這兩個關鍵字控制外層循環的執行,能夠先給外層循環添加一個「標籤」,經過在break或者是continue後面加標籤,達到控制外層循環的目的。咱們來看以下代碼:
在這段代碼中,咱們給內外兩層循環都加上了標籤,分別叫作inner和outer。咱們在內層循環中,當」j==4」的狀況下執行continue語句,而且在continue的後面加上外層循環的標籤outer,就能控制外層循環結束本次循環,直接進入下一次循環,所以循環代碼執行過程當中,不會在控制檯上打印出」test」。其執行結果以下:
同理,咱們若是把代碼中才」continue」換成」break」,也可以在內層循環中直接跳出外層循環。
雖然從技術角度來講,Java語言可以實如今內層循環中控制外層循環,可是從程序設計的角度來說,並不提倡這麼作,由於咱們更但願每一層循環「各司其職」,完成好本身的工做,若是須要從內層循環中直接停止外層循環的執行,能夠設置一個局部變量,內層循環修改局部變量,而外層循環經過判斷局部變量的值來決定是否結束本層循環,這樣代碼的結構性和可讀性都會更好。設計
若是但願系統學習Java編程,能夠點擊連接https://edu.51cto.com/lecturer/2256836.html觀看我在本站的視頻課程。3d