如何解决如何使我的“ goto”最后不运行?
你好! :D
因此,我在下面有此代码。它正在工作,但我不会说它以我想要的方式工作。
因此,我使用goto
跳转到代码的末尾。但是在if
的最后阶段,我有一个goto
导航到igen: Console.WriteLine("Remek! Estre 8-ra érted megyek!");
。发生这种情况时,我不希望下面的代码( nem: Console.WriteLine("Kár,pedig szívesen elhívtalak volna randizni. :(");
)运行。我该如何工作?
提前谢谢!
using System.Reflection.Emit;
namespace Randi
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hány centi vagy?");
int cm = int.Parse(Console.ReadLine());
if (cm <= 175 && cm >= 150);
else goto nem;
{
Console.WriteLine("Naa,tök jó! Az alacsony lányok cukik.");
Console.WriteLine("Hány éves vagy?");
int év = int.Parse(Console.ReadLine());
if (év <= 18 && év >= 16);
else goto nem;
{
Console.WriteLine("Akkor még korban is összepasszolunk!");
Console.WriteLine("Van barátod?");
string kapcsolat = Console.ReadLine();
if (kapcsolat.Contains("Nincs"));
else goto nem;
{
Console.WriteLine("Örülök neki! Eljönnél velem randizni? (Igen/Nem)");
string randi = Console.ReadLine();
if (randi.Contains("Igen")) goto igen;
else goto nem;
}
}
}
igen:
Console.WriteLine("Remek! Estre 8-ra érted megyek!");
nem:
Console.WriteLine("Kár,pedig szívesen elhívtalak volna randizni. :(");
Console.ReadKey();
}
}
}
解决方法
您可以从倒数第二个结尾跳到结尾:
// snip!
igen:
Console.WriteLine("Remek! Estre 8-ra érted megyek!");
goto end;
nem:
Console.WriteLine("Kár,pedig szívesen elhívtalak volna randizni. :(");
end:
Console.ReadKey();
但是,正如曾经编码的人会指出的那样,如果您有充分的理由,对复杂的控制流程使用goto
通常是个坏主意。
您似乎具有确定nem
和igen
两个可能结果之一的逻辑(我不知道您的语言,所以我不知道这段代码实际上是做什么的,可惜)基于用户交互。我们可以将确定结果的部分重构为一种方法,并将其与对结果进行操作的代码分开:
static void Main()
{
var outcome = Interact();
if (outcome)
{
Console.WriteLine("Remek! Estre 8-ra érted megyek!");
}
else
{
Console.WriteLine("Kár,pedig szívesen elhívtalak volna randizni. :(");
}
Console.ReadKey();
}
static bool Interact()
{
int cm = int.Parse(Console.ReadLine());
if (cm <= 175 && cm >= 150);
else return false;
{
Console.WriteLine("Naa,tök jó! Az alacsony lányok cukik.");
Console.WriteLine("Hány éves vagy?");
int év = int.Parse(Console.ReadLine());
if (év <= 18 && év >= 16);
else return false;
{
Console.WriteLine("Akkor még korban is összepasszolunk!");
Console.WriteLine("Van barátod?");
string kapcsolat = Console.ReadLine();
if (kapcsolat.Contains("Nincs"));
else return false;
{
Console.WriteLine("Örülök neki! Eljönnél velem randizni? (Igen/Nem)");
string randi = Console.ReadLine();
if (randi.Contains("Igen")) return true;
else return false;
}
}
}
}
我所做的就是将goto nem
替换为return false
,将goto igen
替换为return true
。这样会好一些,但是跟踪此代码的流程仍然非常困难。首先,每个if (cond); else return x
是一个非常混乱的结构。说if (!cond) return x;
是等效的,也是可以理解的。此外,您正在使用代码块,但是它们没有引入任何有用的结构,只会增加嵌套并使其难以理解。我们可以摆脱所有其他花括号和制表符。 Interact
现在变为:
static bool Interact()
{
int cm = int.Parse(Console.ReadLine());
if (cm > 175 || cm < 150)
{
return false;
}
Console.WriteLine("Naa,tök jó! Az alacsony lányok cukik.");
Console.WriteLine("Hány éves vagy?");
int év = int.Parse(Console.ReadLine());
if (év > 18 || év < 16)
{
return false;
}
Console.WriteLine("Akkor még korban is összepasszolunk!");
Console.WriteLine("Van barátod?");
string kapcsolat = Console.ReadLine();
if (!kapcsolat.Contains("Nincs"))
{
return false;
}
Console.WriteLine("Örülök neki! Eljönnél velem randizni? (Igen/Nem)");
string randi = Console.ReadLine();
if (!randi.Contains("Igen"))
{
return false;
}
return true;
}
这看起来更好。至少现在您可以自上而下地阅读该方法,并且很容易看到我们所做的是读取用户输入3次,检查该输入上的某些条件并确定其是否有效。
对于您的玩具示例来说,这已经足够了,但是在此之后,就有更多的重构机会出现了-该方法有效地处理了3个独立的条件,所以也许每个验证步骤有3个独立的方法会使代码更具可读性?通过删除goto
,您可以更好地控制代码的结构,结构是可读性的关键。老实说,您看一下原始代码段的嵌套级别和goto
会让我感到非常疲倦。您会很快发现使用这样的代码是一件令人讨厌的事情,并且您不想让编程成为一件令人讨厌的事情。
使用函数代替使用goto语句。这可能会导致意大利面条式代码,并且难以维护。另请参阅Go To Statement Considered Harmful。在少数情况下(错误处理,状态机),gotos可以产生更清晰的代码。通常,您会发现有比使用goto更好的解决方案。如果您发现需要使用goto,则应确保它是唯一的选择。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。