使用 '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 "";
}

在这种情况下,第一种方法给出了更好的代码。 (海事组织)