複習筆記12 作用域標記 以及中斷語句





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;
        }
	}
}

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