Как оператор goto работает в этом примере? - PullRequest
10 голосов
/ 31 августа 2010

Я изучаю этот пример кода:

class Program
{
    static void Main(string[] args)
    {
        int x = 10;
        int y = 10;

        int generate=0;

        string [,] myArrayTable = new string[x, y];

        Console.WriteLine("Enter a seek number: ");
        string cautat = Console.ReadLine();

        for (int i = 0; i < x; i++)
        {
            for(int j = 0;j < y; j++)
            {
                myArrayTable[i, j] = (generate++).ToString();
            }
        }

        for(int i=0;i<x;i++)
        {
            for(int j=0;j<y;j++)
            {
                if(cautat.Equals(myArrayTable[i,j]))
                {
                    goto Found; 
                }
            }
        }

        goto NotFound;

        Found: 
          Console.WriteLine("Numarul a fost gasit");

        NotFound:
         Console.WriteLine("Numarul nu a fost gasit !");

        Console.ReadKey();
    }
}

Я не понимаю, почему был вызван оператор "Not Found", и соответствующее сообщение выводится на консоль, если я ввожу номер поиска, например 10, в этом случае выполняется оператор goto: Found, поэтому оператор goto: NotFound никогда не будет вызывается, но соответствующее сообщение выводится на консоль, я не понимаю, как, поскольку в этом случае программа никогда не переходит на эту метку "NotFound".

Пожалуйста, если вы сейчас поможете мне ...

Спасибо

Ответы [ 6 ]

9 голосов
/ 31 августа 2010

Eww goto's, я бы использовал и if/else оператор, но если вам нужно goto's:

Found: 
  Console.WriteLine("Numarul a fost gasit");
  goto End;
NotFound:
  Console.WriteLine("Numarul nu a fost gasit !");
End:
Console.ReadKey();
7 голосов
/ 31 августа 2010

Я бы переписал этот код, чтобы избежать использования goto:

string message;
if (myArrayTable.Cast<string>().Contains(cautat)) {
    message = "Found";
} else {
    message = "Not found!";
}
Console.WriteLine(message);
4 голосов
/ 31 августа 2010

Он вызывается, потому что ваш код внутри метки Found не заставляет его пропускать код внутри метки NotFound (если вы не вызовете goto снова, выполнение будет проходить через метку, а не пропускать).

Как говорится, не используйте goto! Я пойду так далеко, что скажу, что всегда плохая идея и может быть переписана.

В вашем случае вы можете добавить простой логический флаг, чтобы избавиться от вашего перехода:

static void Main(string[] args)
{
    int x = 10, y = 10;
    bool isFound = false;

    // Rest of the body

    for(int i=0;i<x;i++)
    {
        for(int j=0;j<y;j++)
        {
            if(cautat.Equals(myArrayTable[i,j]))
            {
                isFound = true;
                break;
            }
        }

        if(isFound)
            break;
    }

    if(isFound)
        Console.WriteLine("Numarul a fost gasit");
    else
        Console.WriteLine("Numarul nu a fost gasit!");

    Console.ReadKey();
}
1 голос
/ 31 августа 2010

Если вы не хотите, чтобы выполнялись проверки «Не найдено», если выполняются проверки «Найдено», используйте другое goto, чтобы пропустить часть NotFound. goto переходит к разделу, но это не означает, что раздел не будет выполнен, если к нему не был выполнен переход через goto. Помните, что код выполняется в нисходящем порядке, поэтому, если вы не пропустите часть кода, он будет выполнен.

пример:

Found:  
    Console.WriteLine("Numarul a fost gasit"); 

goto ReadKey;

NotFound: 
    Console.WriteLine("Numarul nu a fost gasit !"); 

ReadKey:
    Console.ReadKey(); 
1 голос
/ 31 августа 2010

Потому что вы просто перепрыгиваете на ярлык «Найдено» и переходите к ярлыку «Не найдено». Вам понадобится третий ярлык с именем EndFound и перейдите к нему после того, как он найден.

Found: 
    Console.WriteLine("Numarul a fost gasit");
    goto EndFound;
NotFound:
    Console.WriteLine("Numarul nu a fost gasit !");
EndFound:
0 голосов
/ 31 августа 2010

Поскольку после перехода к Found выполнение просто продолжается до следующей строки, которая оказывается строкой записи "not found" консоли. Вам нужно добавить еще одно goto, чтобы перепрыгнуть через него (или, что еще лучше, переделать это, чтобы полностью избежать gotos)

Это именно такая проблема, что следует избегать gotos.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...