public class Test13
{
public static void main(String[] args)
{
//標記以及中斷語句
//java和c++有個小區別,c++中可以使用goto
//進行跳轉,事實上c++中goto用的比較多的就是
//goto end,而在java中也沿襲了這一傳統,就
//是一個閹割版的goto指令
//標記的作用是給當前作用域的結束位置起個名字,
//並可通過break語句進行goto跳轉
//標記並不會增加程序負擔,不會聲明變量之類的
int x = 4;
//本行代碼毫無意義,C並沒有被使用,而其作用域也
//僅限在syso方法執行後,所以跟單執行syso沒有區別
C:System.out.println("a");
//該代碼也毫無意義,編譯器也不會把這段寫進去
C:break C;
//該代碼可以執行判斷之後的代碼中斷,就像void的方法
//中的邊界檢測,不符合規則的直接 return; 方式一樣
x = 3;
D:{
if(x < 4) break D;
x*=5;
}
//此代碼與上方代碼並沒有任何區別,包括編譯後的字節碼
//都是一模一樣的
x = 3;
if(x < 4);
else
x*=5;
//假設這樣一個場景,我們有未知個數組,不能進行合併,
//並且沒一個數組中的數組字符串未知,這裏僅假設需要找
//到6,就可以不在往下查找了。
String[] strings1 = {"1","2","3","4","5","6",};
String[] strings2 = {"4","5","6","1"};
//這種雙循環的方式會導致第二個循環還會查找6,降低效率
for (String string : strings1)
{
if(string.equals("6"))
break;
}
for (String string : strings2)
{
if(string.equals("6"))
break;
}
//該種型式的代碼在第一個循環找到6之後跳出整個C,第二個
//循環不會被執行
//C:{}也是一種新用法,用來標記代碼塊的作用域,這裏的
//break C; 跟函數裏的return; 可以達到相同的目的,
//只不過break是中斷代碼塊,而return;是中斷函數
C:{
for (String string : strings1)
{
if(string.equals("6"))
break C;
}
for (String string : strings2)
{
if(string.equals("6"))
break C;
}
}
//這種方式也可以,但是多了一個布爾,並且之後的每次循環都
//會判斷是否6被找到了,效率會降低
boolean issearched = false;
for (String string : strings1)
{
if(string.equals("6"))
{
issearched = true; break;
}
}
if (issearched)
{
for (String string : strings2)
{
if(string.equals("6"))
break;
}
}
//比如這段代碼,同樣的情況也可以用標記來做
x = 8;
int y = 0;
if((x & 1) == 0)
if((x & 2) == 0)
if((x & 4) == 0)
y = 3;
else
y = 2;
else
y = 1;
//本質上沒什麼邏輯上的區別
A:if((x & 1) == 0)
{
if((x & 2) == 0)
{
if((x & 4) == 0)
{
y = 3;
break A;
}
y = 2;
break A;
}
y = 1;
}
//switch這麼寫是沒錯,不過break本身也支持跳出
//加標記沒什麼意義
A:switch(x)
{
case 0:
break A;
}
//給定作用域的雙標記,他們將會保持同一作用域
//也就是說,這裏break A 和 J都可以達到目的
//這裏的編譯通過我猜是因爲J在標記之後本身他也
//代表作用域,所以A在對J進行標記也是可行的
A:J:
{
if(x < 0)
break A;
break J;
}
}
}
複習筆記12 作用域標記 以及中斷語句
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.