郴州网站建设价格seo如何去做优化
说明:goto
在一些编程语言(如C语言)中,是用来表示跳转的,即代码执行到此处跳转到对应位置继续执行。
举例
举个例子,如下,是一个双层嵌套循环。现在我需要代码在内层循环符合某条件时跳出双层循环,即跳出整个双层循环。
public static void main(String[] args) {int[][] array = new int[10][10];// 放入一个特殊值,作keyarray[7][7] = 1000;// 依序赋值for (int i = 0; i < array.length; i++) {for (int j = 0; j < array[i].length; j++) {if (array[i][j] == 0) {array[i][j] = i * array.length + j + 1;}}}// 寻找特殊值for (int i = 0; i < array.length; i++) {for (int j = 0; j < array[i].length; j++) {if (array[i][j] == 1000) {System.out.println("got it!");break;}System.out.print(array[i][j] + " ");}System.out.println();}}
执行,可以看到,break
只能跳出内循环,外循环没有跳过。但按照代码描述,找出特殊值后,代码没有继续执行下去的必要。
解决
上面这种场景博主在项目中遇到过,可以有两种解决思路。第一种就是引入变量,设置一个开关,内循环符合条件后,修改开关,外循环判断,如下:
public static void main(String[] args) {int[][] array = new int[10][10];// 放入一个特殊值,作keyarray[7][7] = 1000;// 依序赋值for (int i = 0; i < array.length; i++) {for (int j = 0; j < array[i].length; j++) {if (array[i][j] == 0) {array[i][j] = i * array.length + j + 1;}}}// 定义一个开关boolean flag = true;// 寻找特殊值for (int i = 0; i < array.length; i++) {if (flag) {for (int j = 0; j < array[i].length; j++) {if (array[i][j] == 1000) {System.out.println("got it!");// 符合条件,设置开关flag = false;break;}System.out.print(array[i][j] + " ");}}System.out.println();}}
执行如下,能达到目的
第二种方式,就是使用类似 goto
的方式,可定义代码 break
跳出到某处,如下:
public static void main(String[] args) {int[][] array = new int[10][10];// 放入一个特殊值,作keyarray[7][7] = 1000;// 依序赋值for (int i = 0; i < array.length; i++) {for (int j = 0; j < array[i].length; j++) {if (array[i][j] == 0) {array[i][j] = i * array.length + j + 1;}}}// 寻找特殊值// 打一个标签out:for (int i = 0; i < array.length; i++) {for (int j = 0; j < array[i].length; j++) {if (array[i][j] == 1000) {System.out.println("got it!");// 跳出到out标签break out;}System.out.print(array[i][j] + " ");}System.out.println();}}
效果一样,但显然上面这种更优雅(zhuang b)一点
另外
在Java语言中,禁止C语言那种随意跳转代码执行的语法规则,但仍保留了 goto
关键字(没有特殊用法),同时支持上面这种可跳出多层循环(不仅双层循环)的语法。如果你的代码中有上述跳出多层嵌套循环的逻辑,这不失为一种选择。
个人认为Java把 goto
砍掉是对的,随意跳转代码执行提高了程序员阅读代码的难度,因为它破坏了代码 从上到下,顺序执行 的逻辑。