使用 'goto' 从 if 移动到 else
Using 'goto' to move from if to else
我知道java中没有goto
,但我想问一下一般是否有从if到else到goto
的方法
示例:
public void decToAsci(String decimal) {
String nb = "";
int number;
for (int i = 0; i < decimal.length(); i++) {
Character c = decimal.charAt(i);
if (!c.equals(' ')) {
nb += decimal.charAt(i);
if (i == decimal.length() - 1)
//here i want to jump to else
// i can do it like this :
// System.out.print( (char) Integer.parseInt(nb) + " ");
// but i repeat code in else here ..i just want to jump to else
} else {
number = Integer.parseInt(nb);
System.out.print((char) number + " ");
nb = "";
number = 0;
}
}
}
我试试这个:
if (!c.equals(' ')) {
nb += decimal.charAt(i);
if (i == decimal.length() - 1) continue label;
} else {
label: the code in else
}
但没有用,也没有用 break 标签。我明白,继续,休息。 son和parent之间都是这样用的吗? :
label:
for(int i=0 ; i<n ; i++)
if (cond) break label;
我问一个可以从if跳转到else的方法(2儿子)
(不是一个儿子和一个 parent,而是在 2 个儿子之间跳来跳去)
我认为即使使用 goto
on c 和 c++ 4 示例我们也做不到
Java 没有 goto
。但是,如果我理解你的话,你可能会使用 switch
,默认行为是 fall-through 所以像
int number;
for(int i=0 ; i<decimal.length() ; i++ )
{
Character c = decimal.charAt(i);
switch (c) {
default: // <-- c is not ' '
nb += decimal.charAt(i);
if (i != decimal.length() - 1) {
break;
}
// i == decimal.length() - 1, fall-through
case ' ': // <-- c is ' ', or it fell through
number = Integer.parseInt(nb);
System.out.print( (char) number + " ");
nb = "";
number = 0;
}
}
我觉得你没有想清楚。 if-else 语句的设计方式使您无法从 if
分支跳转到 else
分支。 if 语句的全部意义在于明确 "if this is true, do this, otherwise do that." 试图通过使用肮脏的技巧来违反这一点只会导致维护问题。你的代码会变得很难理解。
与其考虑如何破坏 if 语句,不如找到解决方法?您在这里所做的似乎只是读取由白色 space 分隔的整数。如果那是您正在做的,为什么不在循环之前将 ' '
字符附加到字符串的末尾?这将实现与条件 i == decimal.length() - 1
相同的结果
decimal += " ";
String nb = "";
int number;
for (int i = 0; i < decimal.length(); i++) {
...
或者您可以使用 Scanner
:
Scanner s = new Scanner(decimal);
while (s.hasNextInt())
System.out.print(((char)s.nextInt()) + " ");
任何使用 "goto like" 行为的东西都是坏主意。人们普遍认为,与坚持使用 "structured programming" 控制结构相比,类似 goto 的控制结构导致代码更难阅读/维护。
这里有 (IMO) 两个 "right approaches" 来解决问题:
方法 #1 - 重新排列逻辑
public void decToAsci(String decimal) {
String nb = "";
for (int i = 0; i < decimal.length(); i++) {
Character c = decimal.charAt(i);
if (!c.equals(' ')) {
nb += decimal.charAt(i);
}
if (c.equals(' ') || i == decimal.length() - 1) {
int number = Integer.parseInt(nb);
System.out.print((char) number + " ");
nb = "";
}
}
}
(如果 c.equals(' ')
很昂贵,您可以使用临时变量来避免重新计算它。在这种情况下,它很便宜,并且可能会被 JIT 编译器内联和进一步优化。)
方法 #2 - 将代码重构为方法
public void decToAsci(String decimal) {
String nb = "";
for (int i = 0; i < decimal.length(); i++) {
Character c = decimal.charAt(i);
if (!c.equals(' ')) {
nb += decimal.charAt(i);
if (i == decimal.length() - 1)
nb = processAsInt(nb);
} else {
nb = processAsInt(nb);
}
}
}
public String processInt(String nb) {
int number = Integer.parseInt(nb);
System.out.print((char) number + " ");
return "";
}
在这种情况下,第一种方法给出了更好的代码。 (海事组织)
我知道java中没有goto
,但我想问一下一般是否有从if到else到goto
的方法
示例:
public void decToAsci(String decimal) {
String nb = "";
int number;
for (int i = 0; i < decimal.length(); i++) {
Character c = decimal.charAt(i);
if (!c.equals(' ')) {
nb += decimal.charAt(i);
if (i == decimal.length() - 1)
//here i want to jump to else
// i can do it like this :
// System.out.print( (char) Integer.parseInt(nb) + " ");
// but i repeat code in else here ..i just want to jump to else
} else {
number = Integer.parseInt(nb);
System.out.print((char) number + " ");
nb = "";
number = 0;
}
}
}
我试试这个:
if (!c.equals(' ')) {
nb += decimal.charAt(i);
if (i == decimal.length() - 1) continue label;
} else {
label: the code in else
}
但没有用,也没有用 break 标签。我明白,继续,休息。 son和parent之间都是这样用的吗? :
label:
for(int i=0 ; i<n ; i++)
if (cond) break label;
我问一个可以从if跳转到else的方法(2儿子)
(不是一个儿子和一个 parent,而是在 2 个儿子之间跳来跳去)
我认为即使使用 goto
on c 和 c++ 4 示例我们也做不到
Java 没有 goto
。但是,如果我理解你的话,你可能会使用 switch
,默认行为是 fall-through 所以像
int number;
for(int i=0 ; i<decimal.length() ; i++ )
{
Character c = decimal.charAt(i);
switch (c) {
default: // <-- c is not ' '
nb += decimal.charAt(i);
if (i != decimal.length() - 1) {
break;
}
// i == decimal.length() - 1, fall-through
case ' ': // <-- c is ' ', or it fell through
number = Integer.parseInt(nb);
System.out.print( (char) number + " ");
nb = "";
number = 0;
}
}
我觉得你没有想清楚。 if-else 语句的设计方式使您无法从 if
分支跳转到 else
分支。 if 语句的全部意义在于明确 "if this is true, do this, otherwise do that." 试图通过使用肮脏的技巧来违反这一点只会导致维护问题。你的代码会变得很难理解。
与其考虑如何破坏 if 语句,不如找到解决方法?您在这里所做的似乎只是读取由白色 space 分隔的整数。如果那是您正在做的,为什么不在循环之前将 ' '
字符附加到字符串的末尾?这将实现与条件 i == decimal.length() - 1
decimal += " ";
String nb = "";
int number;
for (int i = 0; i < decimal.length(); i++) {
...
或者您可以使用 Scanner
:
Scanner s = new Scanner(decimal);
while (s.hasNextInt())
System.out.print(((char)s.nextInt()) + " ");
任何使用 "goto like" 行为的东西都是坏主意。人们普遍认为,与坚持使用 "structured programming" 控制结构相比,类似 goto 的控制结构导致代码更难阅读/维护。
这里有 (IMO) 两个 "right approaches" 来解决问题:
方法 #1 - 重新排列逻辑
public void decToAsci(String decimal) {
String nb = "";
for (int i = 0; i < decimal.length(); i++) {
Character c = decimal.charAt(i);
if (!c.equals(' ')) {
nb += decimal.charAt(i);
}
if (c.equals(' ') || i == decimal.length() - 1) {
int number = Integer.parseInt(nb);
System.out.print((char) number + " ");
nb = "";
}
}
}
(如果 c.equals(' ')
很昂贵,您可以使用临时变量来避免重新计算它。在这种情况下,它很便宜,并且可能会被 JIT 编译器内联和进一步优化。)
方法 #2 - 将代码重构为方法
public void decToAsci(String decimal) {
String nb = "";
for (int i = 0; i < decimal.length(); i++) {
Character c = decimal.charAt(i);
if (!c.equals(' ')) {
nb += decimal.charAt(i);
if (i == decimal.length() - 1)
nb = processAsInt(nb);
} else {
nb = processAsInt(nb);
}
}
}
public String processInt(String nb) {
int number = Integer.parseInt(nb);
System.out.print((char) number + " ");
return "";
}
在这种情况下,第一种方法给出了更好的代码。 (海事组织)