パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

C#学習 11」記事へのコメント

  • by Anonymous Coward

    今のソースコードは、ゲームを進めていくと突然ゲームが落ちるバグがあります。

    原因は Main() の内部で Main() を呼び出しているからです。
    ある関数Xの内部から関数X自身を呼び出す方法を「再帰呼び出し」といいますが
    再帰呼び出しが出来る回数には上限があります

    たとえば

    static int count = 0;
    static void Main()
    {
            count++;
      Console.WriteLine("count: {0}", count);
            Main();
    }

    これを実行するとプログラムがクラッシュします
    多分デフォルトのC#環境なら count の値が10000ぐらいになると落ちると思います
    (手元にC#環境

    • by Anonymous Coward

      末尾呼び出しや末尾再帰は、処理系によっては最適化されて、ただのジャンプやループに変換されるから、必ずしもスタックオーバーフローが起きるわけではない。C#の場合はx64でリリースビルドなら末尾最適化があるらしい。gcc(C++)だったら、末尾呼び出しの最適化があったので、それを利用したプログラムを作ったことはある。

      まあ、使える条件がかなり限定的なので、普通は使わないほうが良いと思うが、使える場合はコードがシンプルになり、実行速度も速い。

      • by Anonymous Coward on 2020年08月23日 23時20分 (#3875472)

        再帰はまあ使えばいいと思う。メイン関数を再帰呼び出しするのはやめたほうがいいと思う。
        単純に紛らわしいしいわゆる初期化処理を何度も実行するはめになる。

        親コメント

アレゲは一日にしてならず -- アレゲ研究家

処理中...