Java小白踩坑錄 - Java 編程語言中很少被人瞭解的特性(標號語句)

故事背景

隨着工作經歷的增長,小白開始慢慢的開始有計劃的看源代碼,包括公司的代碼和開源框架的源碼,有時候讀着讀着就迷糊了,比如下面的語句會編譯報錯或者打印什麼?

System.out.print("baidu site :");
https://www.baidu.com;
System.out.println(" format");

剛開始時,小白會想:會編譯出錯,中間那行是什麼鬼?

但最後小白測試時,並不會報錯,而是會打印出:

baidu site : format

小白嘗試改成這樣的語句,是不是就不會覺得編譯報錯了?

System.out.print("baidu site :");
https :
//www.baidu.com;
System.out.println(" format");

有點像 switch 語句中的 case:

int q = (n+7)/8;
switch (n%8) {
 case 0: do { foo(); // Great C hack, Tom,
 case 7: foo(); // but it's not valid here.
 case 6: foo();
 case 5: foo();
 case 4: foo();
 case 3: foo();
 case 2: foo();
 case 1: foo();
 } while (--q > 0);
}

原來上面的語句,":" 是 statement label 翻譯成標號語句。

其語法如下:

LabeledStatement: Identifier : StatementLabeledStatementNoShortIf: Identifier : StatementNoShortIf

與 C 和 C++ 不同,Java 中沒有 goto 語句;標號語句用於出現在標號語句內任何地方的 break 或者 continue 語句之上。

再來一個標句語句作爲結尾的練習吧:

class Test {
 	char[] value;
 	int offset, count;
 	int indexOf(TestString str, int fromIndex) {
 	char[] v1 = value, v2 = str.value;
 	int max = offset + (count - str.count);
 	int start = offset + ((fromIndex < 0) ? 0 : fromIndex);
 	i:
 	for (int i = start; i <= max; i++) {
 		int n = str.count, j = i, k = str.offset;
 		while (n-- != 0) {
 		if (v1[j++] != v2[k++])
 			continue i;
 	} 
 	return i - offset;
 }
 return -1;
 }
}

總結

說起 Java 的標籤,很容易聯想到 Java 的循環語句。通常,在 Java 編程中,用到標籤的地方大多是在循環語句之前。在標籤和循環之前最好不要加入其它的語句。最後,不要爲了使用標句語句而使用標句語句。

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