-5

我正在使用 Cosmos 制作一个操作系统,并想使用它goto来访问用户输入,但我收到了错误

在 goto 语句的范围内没有这样的标签“输入”

“输入”是用户输入的变量。

我可以理解为什么会这样,但我该如何解决呢?

4

2 回答 2

1

您不能将用户变量用作 goto 语句的范围标识符。您必须在范围(命名空间)内使用标签标识符,通过“:”表示它。

例如

using System;

class Program
{
    static void Main()
    {
        Console.WriteLine(M());
    }

    static int M()
    {
        int dummy = 0;
        for (int a = 0; a < 10; a++)
        {
            for (int y = 0; y < 10; y++) // Run until condition.
            {
                for (int x = 0; x < 10; x++) // Run until condition.
                {
                    if (x == 5 &&
                        y == 5)
                    {
                        goto Outer;
                    }
                }
                dummy++;
            }
        Outer:
            continue;
        }
        return dummy;
    }
}

方法 M 包含三个嵌套循环。第一个循环遍历数字 [0, 9],两个内部循环也是如此。但在第三个循环中,使用 break 关键字检查导致循环退出的条件。休息

每次完成内部循环后,代码都会增加虚拟变量。如果内部循环提前退出,这个变量应该单独保留。使用 goto 语句,它不会递增。结果:值 50 打印到控制台。int 增加 10 x 5 倍。但是:如果 goto 是中断,则结果将是 10 x 10 次,或总共 100。

希望这个帮助.. :)

于 2017-02-13T08:30:39.640 回答
0

我正在使用 Cosmos 制作操作系统

为了获得任何远程有用的答案,我认为您必须提供一些有关操作系统范围的信息。您只是稍微摆弄一下 COSMOS,还是有一些特殊的用例想要使用自定义 COSMOS 操作系统?

并想使用 goto 转到用户输入

尤其是在后一种情况下(专用操作系统),您应该明确避免使用 GOTO,除非您有充分的理由这样做(在我看来,没有使用 GOTO 的真正充分理由)。在现代编程语言中有 GOTO 的可行替代方案,您应该重新考虑您的设计、算法等。

回答你的问题。这是一个产生您遇到的错误消息的示例

private void FirstMethod()
{
    goto MyLabel;
}

private void SecondMethod()
{
    MyLabel:
    return;
}

我在 中定义了一个标签Method。无论如何,从Main你不能简单地从 main 跳转到另一个方法,因为编译器不知道在方法完成后返回到哪里,因为没有数据会被推送到 GOTO 上的调用堆栈(请参阅维基百科页面关于调用堆栈以获取更多信息)。

无论如何,以下内容会起作用,因为标签和 GOTO 位于同一范围内

void MyMethod()
{
    goto MyLabel;
    // do something
    MyLabel:
    return;
}
于 2017-02-13T08:40:25.600 回答