Java雜記3—流程控制之條件

Java雜記發表於2019-01-19

流程控制

首先來介紹程式的流程控制。

所謂的流程控制,就是在我們前面的課程中我們已經學過了變數,資料型別,運算子,表示式,這些都是計算機程式設計的基本元素,但是我們程式的基本執行單元應該是語句,程式執行,執行的不是表示式,而是執行語句。就好像我們小時候先學認字兒,再學組詞,但最終要學造句,因為寫作文一定是一句話一句話的寫。

那麼計算機程式一定會有多個語句,這個語句的執行順序就叫做流程控制,我程式碼中這麼多語句先執行誰後執行誰,每個語句執行幾遍,要不要執行要不要不執行這都叫流程控制。

順序執行流程,我們的所有語句都放在主函式裡,他一定是從主函式的第一句開始執行,然後執行第二句,第三句,直到把主函式中的每一句自上而下都執行一遍的時候,程式執行結束。比如我在主函式中寫十個列印語句,他一定是一句一句的執行,這顯然是計算機軟體最基本的一種執行流程,順序執行流程。

條件分支流程

而現在我們要介紹的是條件分支流程,條件分支流程也叫做分支結構,選擇結構,它主要解決的是有些語句我在執行以前要先去判斷一個條件,根據這個條件來決定這條語句,或者後面的某個程式碼塊執行或者不執行。如果說以前的順序流程是每句話執行一遍的話,條件分支結構是每句話執行0-1遍,也許條件成立會執行,條件不成立這句話就會不執行。

if語句

說到條件分支流程,最基本的語法就是一個if語句,語法結構如下。

if(布林表示式){
  程式碼塊
}

關鍵字if,If後面方一個圓括號 圓括號裡寫什麼?必須是一個布林表示式 不可以寫整數。在C語言中布林表示式和整數表示式是相同的,0表示假,非0值表示真,但是在java中真就是真 1就是1 真不是1 1也不是真 這是java和c的重要區別,其實也是java簡單性的體現。

解釋一下,例如int a = 10 int b =5

本來我要比較a和b是否相等,if(a==b) 但是我寫錯了,少寫了一個等號,寫成了if(a=b)。那麼在java中一個等號是賦值表示式最後的結果是5 是會報錯的,但是在C中是沒有問題的,不會報錯。這樣的錯誤不能及時發現就會造成一定的問題,而實際上在C的開發中這也確實是一個問題。所以java在設計的時候就補上了這個漏洞,其結果就是在java中if後面的圓括號中只能夠放布林表示式。

後面跟一個程式碼塊 邏輯關係是當布林表示式為真的時候執行程式碼塊,為假的時候不執行。所謂程式碼塊就是一個花括號,我們們也沒少見,類啊,方法啊都是一個花括號。

舉個例子,使用者輸入一個整數,我們通過程式來判斷這個整數是偶數還是奇數,如果是偶數就輸出偶數到控制檯,如果是奇數就什麼也不輸出。程式碼如下:

Scanner s = new Scanner(System.in);
int n = s.nextInt();

if(n%i==0){
  System.out.println("偶數");
}

這就是最基本的if語句。

if else語句

那麼我們的邏輯繼續變化,如果那個數字兒是偶數就列印偶數兩個字兒,如果是奇數就列印奇數兩個字兒。那麼這時候需要第二個語法結構,if else。

if(布林表示式){
  程式碼塊1
}else{
  程式碼塊2
}

當布林表示式為真的時候執行程式碼塊1,else就是否則的意思,什麼叫否則,就是當前面的那個布林表示式為假的時候就執行else後面的程式碼塊,這就真正是條件分支了,程式碼塊1和程式碼塊2怎麼著都會執行一個,條件為真執行程式碼塊1,條件為假執行程式碼塊2。
根據這個邏輯我們對之前的程式碼做一定的修改,如果條件為假else後面再加一個程式碼塊列印奇數。

Scanner s = new Scanner(System.in);
int n = s.nextInt();

if(n%i==0){
  System.out.println("偶數");
}else{
  System.out.println("奇數");
}

以上就是if else結構。

if else if

下面我們看一下多重if else結構,它會有多個條件,語法結構如下

if(條件1){
  程式碼塊1
}else if(條件2){
  程式碼塊2
}else if(條件3){
  程式碼塊3
}else{
  程式碼塊4
}

先是if條件1,當條件1成立的時候會執行程式碼塊1,else if條件2,else代表當條件1不滿足的時候,進入這個else,判斷條件2,條件2成立執行對應程式碼塊,然後執行結束。如果進入第三個條件,說明前兩個條件都不滿足,這時候再來判斷條件3,如果不滿足條件3,就會到最後一個else中,最後一個可以加if也可以不加,實際上就是前面所有的條件都不滿足就會到最後的else程式碼塊中。

根據這個語法邏輯舉個例子,加入輸入的整數是月份,根據輸入的整數判斷是那個季節,1-3是春節,4-6是夏季,依次。

Scanner s = new Scanner(System.in);
int n = s.nextInt();

if(n<=3){
  System.out.println("春天");
}else if(n<=6){
  System.out.println("夏天");
}else if(n<=9){
  System.out.println("秋天");
}else{
  System.out.println("冬天");
}

以上是關於if語句所有的語法結構,額外的再說一點,if語句可以根據實際的需要進行巢狀,至於巢狀的層數沒有限制。

條件本質

所有的java程式碼在執行的時候最後都會被程式最終都是一條條的指令,CPU有一個指令指示器,指向下一條要執行的指令,CPU根據指示器的指示載入指令並且執行。指令大部分是具體的操作和運算,在執行這些操作時,執行完一個操作後,指令指示器會自動指向挨著的下一個指令。

而有一種特殊的指令,稱為跳轉指令,這些指令會修改指令指示器的值,讓CPU跳到一個指定的地方執行。跳轉有兩種,一種是條件跳轉,另一種是無條件跳轉。條件跳轉檢查某個條件,滿足則進行跳轉,無條件跳轉則是直接進行跳轉。條件分支流程在執行的時候,if, else實際上都會轉換為這些跳轉指令。

下節預告:switch選擇結構,為什麼switch後面的括號中只能夠填如byte,int等型別?


我不能保證每一個地方都是對的,但是可以保證每一句話,每一行程式碼都是經過推敲和斟酌的。希望每一篇文章背後都是自己追求純粹技術人生的態度。

永遠相信美好的事情即將發生。

相關文章