流程控制(1)
- java中流程控制關鍵詞:
- if-else:
- while
- do-while
- for
- return
- break
- switch
⚠️java不支持goto
流程控制(2)
- 所有條件語句都使用條件表達式的真或假(true或false)來決定執行路徑,例:
x == y
⚠️java不允許將數字作爲boolean表達式。
流程控制(3)
- if-else,例:
if(Boolean-expression)
statement
或者
if(Boolean-expression)
statement
else
statement
- 代碼示例
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)
- 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,
- 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
- 逗號運算符,僅用於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)
- 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
- 任何返回數組的方法都可以使用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
- foreach還適用於任何可迭代的對象
- for語句需要在整數值序列中步進,例如:
for(int i = 0; i < 100; i++)
流程控制(6)
- return: 無條件分支關鍵詞。
- 其他無條件分支關鍵詞包括break,continue,以及類似goto功能的語句
- 無條件分支:無需測試即可發生的分支
- return有兩個用途:
- 表明不使用void作爲返回值的方法的返回值,
- 結束當前方法。
流程控制(7)
- break和continue:控制循環流程
- break離開循環
- 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
- 無限循環:
- while(thue)
- for(;😉
流程控制(8)
- goto:彙編語言中流程控制的起源。
- goto是源碼級別的跳轉。
- 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
- 原則:
- continue回到最內層循環的開始繼續執行
- 帶標籤的continue回到label標記處並重新進入label所標記的循環
- break棄用當前循環後面的部分
- 帶標籤的break棄用標籤標記的循環後面的部分
- 使用labels的唯一理由是當循環嵌套時break或continue一層內循環以上
流程控制(9)
- switch:選擇語句
- 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;
}
- integral-selector用於生成整數值
- 當integral-selector生成的整數值和某個integral-value相匹配時,相關的語句就會執行。如果沒有匹配上,則執行default語句
- 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
//...