复习笔记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;
        }
	}
}

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