我正在使用 Cosmos 制作一个操作系统,并想使用它goto
来访问用户输入,但我收到了错误
在 goto 语句的范围内没有这样的标签“输入”
“输入”是用户输入的变量。
我可以理解为什么会这样,但我该如何解决呢?
您不能将用户变量用作 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。
希望这个帮助.. :)
我正在使用 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;
}