Java千問:Java循環語句的幾個冷門知識點你都知道嗎?

我們在進行Java開發的時候,經常會用到循環結構,但是有幾個關於循環的“冷門”知識點,不知道你是不是都已經掌握了呢?我們一起來看看

一、大括號可以不寫嗎?

    我們都知道,如果每次循環過程中要執行的語句只有一條,那麼就可以不用寫大括號。但事實真的如此嗎?請看下面的代碼:

大家可以看到,在循環中只有一條語句,但是並不能通過語法編譯。這是爲什麼呢?因爲Java語言規定:循環語句中重複執行的語句不能是一條單獨的局部變量定義語句。這裏所說的“定義局部變量語句”也可以指創建對象的語句,例如以下代碼也不能通過編譯:

同時,這個規律還可以延伸到條件語句,也就是說,if語句中也不能只有一條單獨的局部變量定義語句,例如以下代碼:

如果我們在以上三段代碼中,給循環或條件語句都添加了大括號,語法錯誤自然就消失了:

 

    二、如何定義多個循環變量?

    我們平時定義的循環往往只有一個循環變量

例如在這個循環中,變量i就是一個循環變量。但是,如果開發過程中,需要我們在一個循環中定義並操作多個循環變量該怎麼辦呢?這時候,我們可以把多個循環變量的定義語句用逗號隔開,並且對循環變量的操作語句也用逗號隔開就可以了。我們以定義並操作兩個循環變量爲例作爲示範,請看以下代碼:

需要說明的是:for循環結構只能有兩個分號(;),並且明確規定第一個分號前面的部分是用來定義並初始化循環變量的。我們知道,一個分號其實就表示一條語句的結束。所以說,第一個分號前面定義並初始化循環變量的語句只能有一條。既然只能有一條語句來定義循環變量,那麼如果需要定義多個循環變量的話,這些循環變量只能同屬一種類型,因爲多種類型的循環變量必須要用多條語句來定義。如果實在需要定義多個類型不相同的循環變量,我們可以乾脆在循環語句之前就把這些變量都定義好。

    三、能否以浮點數作爲循環變量?

    我們通常都會把循環變量定義爲整數類型,如果把循環變量定義爲浮點數可以嗎?我們來做個實驗,請看以下代碼

這段代碼想必大家都能看懂,那麼這段代碼能否正常執行呢?答案是沒問題,它的執行效果如下:

很多人通過這個實驗就下定結論認爲以浮點數作爲循環變量沒有什麼問題,但是我們必須清楚:當一個浮點數大到一定程度的時候,就會導致精度的丟失,從而出現一些奇怪的錯誤。比如,我們把上面代碼中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編程,可以點擊這裏觀看我在本站的視頻課程。有問題也可以加入我的QQ羣291839907一起討論。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章