10

私はこのコードサンプルを研究しています:

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();
    }
}

10のようなシーク番号を入力すると、「Not Found」ステートメントが呼び出され、対応するメッセージがコンソールに出力される理由がわかりません。この場合、goto:Foundステートメントが実行されているため、goto:NotFoundステートメントは呼び出されませんが、それでも対応するメッセージがコンソールに出力されます。この場合、プログラムがこの「NotFound」ラベルにジャンプすることはないため、方法がわかりません。

これについて教えてください...

ありがとう

4

6 に答える 6

10

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();
于 2010-08-31T16:50:18.220 に答える
8

gotoの使用を避けるために、このコードを書き直します。

string message;
if (myArrayTable.Cast<string>().Contains(cautat)) {
    message = "Found";
} else {
    message = "Not found!";
}
Console.WriteLine(message);
于 2010-08-31T16:50:39.437 に答える
4

Foundラベル内のコードには、NotFoundラベル内のコードをスキップするように強制するものがないために呼び出されています(gotoを再度呼び出さない限り、実行はラベルをスキップするのではなく、ラベルを通過します)。

そうは言っても、使用しないでください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();
}
于 2010-08-31T16:48:36.863 に答える
1

見つかったラベルにジャンプして、見つからないラベルにフォールスルーするためです。EndFoundという3番目のラベルが必要で、見つかったらそこに移動します。

Found: 
    Console.WriteLine("Numarul a fost gasit");
    goto EndFound;
NotFound:
    Console.WriteLine("Numarul nu a fost gasit !");
EndFound:
于 2010-08-31T16:49:52.483 に答える
1

「Found」ステートメントが実行されたときに「NotFound」ステートメントを実行したくない場合は、別のgotoを使用して、NotFound部分をスキップします。gotoはセクションにジャンプしますが、gotoを介してジャンプしないと、セクションが実行されないという意味ではありません。コードはトップダウンで実行されるため、コードの一部をスキップしない限り、コードは実行されます。

例:

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

goto ReadKey;

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

ReadKey:
    Console.ReadKey(); 
于 2010-08-31T16:51:04.100 に答える
0

にジャンプした後Found、実行は次の行に進むためです。これはたまたま「見つからない」コンソール書き込み行です。それを飛び越えるには、さらに別のgotoを追加する必要があります(または、さらに良いことに、gotoを完全に回避するためにこれを再設計します)

まさにこのような問題であり、gotosを避ける必要があります。

于 2010-08-31T16:51:01.837 に答える