web-dev-qa-db-ja.com

興味深いインタビュー演習の結果:リターン、ポストインクリメント、リファレンスの動作

これは単純なコンソールアプリケーションコードで、完全に理解できない結果を返します。

コンソールで0、1、または2を出力するかどうかを考えてみてください。

using System;

namespace ConsoleApplication
{
    class Program
    {
        static void Main()
        {
            int i = 0;
            i += Increment(ref i);

            Console.WriteLine(i);
            Console.ReadLine();
        }

        static private int Increment(ref int i)
        {
            return i++;
        }
    }
}

答えは0です。

私が理解していないのは、ポストインクリメントi++Incrementメソッド(ref(渡された変数のコピーではなく)で実行)は変数をインクリメントしますが、後で無視されます。

私が言いたいのは、このビデオです:

誰かがこの例を説明できますか?なぜデバッグ中に値が1に増加するのがわかりますが、その後0に戻りますか?

59
Aremyst

i += Increment(ref i);は次と同等です

i = i + Increment(ref i);

割り当ての右側の式は左から右に評価されるため、次のステップは

i = 0 + Increment(ref i);

return i++は、i(0)の現在の値を返し、iをインクリメントします

i = 0 + 0;

割り当て前のiの値は1(Incrementメソッドでインクリメント)ですが、割り当てにより再び0になります。

102
Jakub Lortz

ここの「魔法」はただ 操作の優先順位 操作の順序

i += Increment(ref i)

と同じです

i = i + Increment(ref i)

+操作は左から右に実行されます

そのため、最初にiを取得します...その時点で0です...

次に、Increment(ref i)...の結果を追加します。これも0 ... 0 + 0 = 0 ...です。しかし、...結果が得られるまで、実際にインクリメントされます...

+演算の左オペランドが評価された後、その増分が行われます...そのため、変更は行われません... 0 + 0はまだ0です...したがって、+演算が実行された後、iには0が割り当てられます

18
DarkSquirrel42

あなたが述べたように-ポストインクリメント「i ++」。ステートメント-「i ++を返す」元の値が返された後、メモリに「i」の値を設定します。

「return ++ i;」を使用してみてくださいそしておそらくあなたはそれを手に入れるでしょう。

0
Debsdoon