java編程思想——流程控制

流程控制(1)

  1. java中流程控制關鍵詞:
    • if-else
    • while
    • do-while
    • for
    • return
    • break
    • switch

⚠️java不支持goto


流程控制(2)

  1. 所有條件語句都使用條件表達式的真或假(truefalse)來決定執行路徑,例:
x == y

⚠️java不允許將數字作爲boolean表達式。


流程控制(3)

  1. if-else,例:
if(Boolean-expression) 
    statement

或者

if(Boolean-expression) 
    statement
else
    statement
  1. 代碼示例
package operators;

import static net.mindview.util.Print.print;

/**
 * @author vincient
 * @create 2020-01-19 10:12 AM
 */
public class IfElse {
    static int result = 0;

    static void test(int testval, int target) {
        if (testval > target) {
            result = +1;
        } else if (testval < target) {
            result = -1;
        } else {
            result = 0;
        }
    }

    public static void main(String[] args) {
        test(10, 5);
        print(result);
        test(5, 10);
        print(result);
        test(5, 5);
        print(result);
    }
}
/**
 * 輸出
 * 1
 * -1
 * 0
 */

流程控制(4)

  1. while循環語句,例:
while(Boolean-expression) 
    statement

while型式的表達式,在每次循環前先計算Boolean-expression
代碼示例:

package operators;

/**
 * @author vincient
 * @create 2020-01-19 10:30 AM
 */
public class WhileTest {
    static boolean condition(){
        boolean result = Math.random() <0.99;
        System.out.print(result + ", ");
        return result;
    }

    public static void main(String[] args) {
        while (condition()) {
            System.out.println("Inside 'while'");
            System.out.println("Exited 'while'");
        }
    }
}

//    結果示例
//    true, Inside 'while'
//    Exited 'while'
//    true, Inside 'while'
//    Exited 'while'
//    true, Inside 'while'
//    ···
//    false, 

  1. do-while循環語句,例:
do 
    statement
while(Boolean-expression);

do-while和while的區別,do-while中的statement至少執行一次,不管Boolean-expression第一次計算結果是否爲false,while的話,如果一開始Boolean-expression計算結果爲false,statement不會執行。
3. for循環語句,例:

for(initialization; Boolean-expression; step)
    statement

initialization,Boolean-expression和step都可以爲空。布爾表達式在每次迭代之前執行。在布爾表達式計算爲false以前,會一直執行for語句之後的代碼行。在每次循環之後,執行step。
代碼示例:

package operators;

/**
 * @author vincient
 * @create 2020-01-19 11:05 AM
 */
public class ListCharacters {
    public static void main(String[] args) {
        for (char c = 0; c < 128; c++) {
            if (Character.isLowerCase(c)) {
                System.out.println("value: " + (int) c + " character: " + c);
            }
        }
    }
}
//    輸出結果
//    value: 97 character: a
//    value: 98 character: b
//    value: 99 character: c
//    value: 100 character: d
//    value: 101 character: e
//    value: 102 character: f
//    value: 103 character: g
//    value: 104 character: h
//    value: 105 character: i
//    value: 106 character: j
//    value: 107 character: k
//    value: 108 character: l
//    value: 109 character: m
//    value: 110 character: n
//    value: 111 character: o
//    value: 112 character: p
//    value: 113 character: q
//    value: 114 character: r
//    value: 115 character: s
//    value: 116 character: t
//    value: 117 character: u
//    value: 118 character: v
//    value: 119 character: w
//    value: 120 character: x
//    value: 121 character: y
//    value: 122 character: z
  1. 逗號運算符,僅用於for循環中,可以用來定義多個變量,但是每個變量必須是相同類型的。
    代碼示例:
package operators;

/**
 * @author vincient
 * @create 2020-01-19 11:23 AM
 */
public class CommaOperator {
    public static void main(String[] args) {
        for (int i = 1, j = i + 10; i < 5; i++, j = i * 2) {
            System.out.println("i = " + i + " j = " + j);
        }
    }
}
//    輸出結果:
//    i = 1 j = 11
//    i = 2 j = 4
//    i = 3 j = 6
//    i = 4 j = 8

流程控制(5)

  1. Foreach語法:更簡明的for語法。
    代碼示例:
package operators;

import java.util.Random;

/**
 * @author vincient
 * @create 2020-01-19 12:49 PM
 */
public class ForEachFloat {
    public static void main(String[] args) {
        Random rand = new Random(47);
        float f[] = new float[10];
        for (int i = 0; i < 10; i++) {
            f[i] = rand.nextFloat();
        }
        for (float x : f) {
            System.out.println(x);
        }
    }
}

//    輸出結果
//    0.72711575
//    0.39982635
//    0.5309454
//    0.0534122
//    0.16020656
//    0.57799757
//    0.18847865
//    0.4170137
//    0.51660204
//    0.73734957
  1. 任何返回數組的方法都可以使用foreach
    代碼示例:
package operators;

/**
 * @author vincient
 * @create 2020-01-19 12:58 PM
 */
public class ForEachString {
    public static void main(String[] args) {
        for (char c : "An African Swallow".toCharArray()) {
            System.out.print(c + " ");
        }
    }
}
//    輸出結果
//    A n   A f r i c a n   S w a l l o w 
  1. foreach還適用於任何可迭代的對象
  2. for語句需要在整數值序列中步進,例如:
for(int i = 0; i < 100; i++)

流程控制(6)

  1. return: 無條件分支關鍵詞。
  2. 其他無條件分支關鍵詞包括breakcontinue,以及類似goto功能的語句
  3. 無條件分支:無需測試即可發生的分支
  4. return有兩個用途:
    • 表明不使用void作爲返回值的方法的返回值,
    • 結束當前方法。

流程控制(7)

  1. breakcontinue:控制循環流程
  2. break離開循環
  3. continue離開當前循環,開始下一輪循環
    代碼示例:
package operators;

import static net.mindview.util.Range.range;

/**
 * @author vincient
 * @create 2020-01-19 3:37 PM
 */
public class BreakAndContinue {
    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            if (i == 74) break;
            if (i % 9 != 0) continue;
            System.out.print(i + " ");
        }
        System.out.println();
        for (int i : range(100)) {
            if (i == 74) break;
            if (i % 9 != 0) continue;
            System.out.print(i + " ");
        }
        System.out.println();
        int i = 0;
        while (true) {
            i++;
            int j = i * 27;
            if (j == 1269) break;
            if (i % 10 != 0) continue;
            System.out.print(i + " ");
        }
    }
}
// 輸出結果
// 0 9 18 27 36 45 54 63 72
// 0 9 18 27 36 45 54 63 72
// 10 20 30 40 
  1. 無限循環:
    • while(thue)
    • for(;😉

流程控制(8)

  1. goto:彙編語言中流程控制的起源。
  2. goto是源碼級別的跳轉。
  3. java中的goto和break和continue關鍵詞有關,都使用label機制。例如
label1: 
outer-iteration{
    inner-iteration{ 
        //...
        break; // (1) 
        //...
        continue; // (2) 
        //...
        continue label1; // (3) 
        //...
        break label1; // (4)
    }
}
  • 意義:中斷循環,回到標籤所指定的地方
  • 語句(1):跳出內部迭代,執行外部迭代
  • 語句(2):開始下一輪內部迭代
  • 語句(3):中斷內外迭代,轉到label1,然後從外部迭代開始
  • 語句(4):中斷內外迭代,轉到label1,不再重新進入迭代
    代碼示例:
package operators;

import static net.mindview.util.Print.print;

/**
 * @author vincient
 * @create 2020-01-19 4:50 PM
 */
public class LabeledFor {
    public static void main(String[] args) {
        int i = 0;
        outer:
        for (; true; ) {
            inner:
            for (; i < 10; i++) {
                print("i = " + i);
                if (i == 2) {
                    print("continue");
                    continue;
                }
                if (i == 3) {
                    print("break");
                    i++;
                    break;
                }
                if (i == 7) {
                    print("continue outer");
                    i++;
                    continue outer;
                }
                if (i == 8) {
                    print("break outer");
                    break outer;
                }
                for (int k = 0; k < 5; k++) {
                    if (k == 3) {
                        print("continue inner");
                        continue inner;
                    }
                }
            }
        }
    }
}
// 輸出結果
//i = 0
//continue inner
//i = 1
//continue inner
//i = 2
//continue
//i = 3
//break
//i = 4
//continue inner
//i = 5
//continue inner
//i = 6
//continue inner
//i = 7
//continue outer
//i = 8
//break outer
package operators;

import static net.mindview.util.Print.print;

/**
 * @author vincient
 * @create 2020-01-19 5:09 PM
 */
public class LabeledWhile {
    public static void main(String[] args) {
        int i = 0;
        outer:
        while (true) {
            print("Outer while loop");
            while (true) {
                i++;
                print("i = " + i);
                if (i == 1) {
                    print("continue");
                    continue;
                }
                if (i == 3) {
                    print("continue outer");
                    continue outer;
                }
                if (i == 5) {
                    print("break");
                    break;
                }
                if (i == 7) {
                    print("break outer");
                    break outer;
                }
            }
        }
    }
}
//輸出結果:
//Outer while loop
//i = 1
//continue
//i = 2
//i = 3
//continue outer
//Outer while loop
//i = 4
//i = 5
//break
//Outer while loop
//i = 6
//i = 7
//break outer
  1. 原則:
    • continue回到最內層循環的開始繼續執行
    • 帶標籤的continue回到label標記處並重新進入label所標記的循環
    • break棄用當前循環後面的部分
    • 帶標籤的break棄用標籤標記的循環後面的部分
  2. 使用labels的唯一理由是當循環嵌套時breakcontinue一層內循環以上

流程控制(9)

  1. switch:選擇語句
  2. switch語句的常見格式:
switch(integral-selector){
    case integral-value1 : statement; break;
    case integral-value2 : statement; break; 
    case integral-value3 : statement; break;
    case integral-value4 : statement; break;
    case integral-value5 : statement; break;
    // ...
    default: statement;
}
  1. integral-selector用於生成整數值
  2. 當integral-selector生成的整數值和某個integral-value相匹配時,相關的語句就會執行。如果沒有匹配上,則執行default語句
  3. break是可選的。break使代碼執行跳轉到switch主體的末尾。如果break丟失了,則依序執行剩餘case語句,直到遭遇某個break
    示例代碼:
package operators;

import java.util.Random;

import static net.mindview.util.Print.print;
import static net.mindview.util.Print.printnb;

/**
 * @author vincient
 * @create 2020-01-19 5:56 PM
 */
public class VowelsAndConsonants {
    public static void main(String[] args) {
        Random rand = new Random(47);
        for (int i = 0; i < 100; i++) {
            int c = rand.nextInt(26) + 'a';
            printnb((char) c + ", " + c + ": ");
            switch (c) {
                case 'a':
                case 'e':
                case 'i':
                case 'o':
                case 'u':
                    print("vowel");
                    break;
                case 'y':
                case 'w':
                    print("Sometimes a vowel");
                    break;
                default:
                    print("consonant");
            }
        }
    }
}
//輸出結果:
//y, 121: Sometimes a vowel
//n, 110: consonant
//z, 122: consonant
//b, 98: consonant
//r, 114: consonant
//n, 110: consonant
//y, 121: Sometimes a vowel
//g, 103: consonant
//c, 99: consonant
//f, 102: consonant
//o, 111: vowel
//w, 119: Sometimes a vowel
//z, 122: consonant
//...
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章