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 作用域标记 以及中断语句
最新推荐文章于 2024-01-06 12:13:19 发布