微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使我的“ goto”最后不运行?

如何解决如何使我的“ 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通常是个坏主意。

您似乎具有确定nemigen两个可能结果之一的逻辑(我不知道您的语言,所以我不知道这段代码实际上是做什么的,可惜)基于用户交互。我们可以将确定结果的部分重构为一种方法,并将其与对结果进行操作的代码分开:

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 举报,一经查实,本站将立刻删除。