Wawancara yang menarik hasil latihan: kembali, post increment dan ref perilaku

Berikut ini's sederhana kode aplikasi konsol, yang mengembalikan hasilnya saya tidak mengerti sepenuhnya.

Cobalah untuk berpikir apakah itu output 0, 1 atau 2 di konsol:

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++;
        }
    }
}

Jawabannya adalah 0.

Apa yang saya don't mengerti adalah mengapa pasca kenaikan i++, dari Increment metode, yang dilaksanakan pada ref (tidak di copy berlalu variabel) apakah kenaikan variabel, tapi itu hanya akan diabaikan nanti.

Yang saya maksud adalah dalam video ini:

Adakah yang bisa menjelaskan ini contoh dan mengapa selama debug saya melihat bahwa nilai bertambah 1, tapi kemudian ia kembali ke 0?

Mengomentari pertanyaan (9)
Larutan

i += Increment(ref i); setara dengan

i = i + Increment(ref i);

Ekspresi pada sisi kanan dari tugas dievaluasi dari kiri ke kanan, jadi langkah berikutnya adalah

i = 0 + Increment(ref i);

kembali aku++ mengembalikan nilai saat ini dari aku (yang adalah 0), maka penambahan aku

i = 0 + 0;

Sebelum penetapan nilai aku adalah 1 (bertambah dalam Increment method), tetapi tugas membuatnya 0 lagi.

Komentar (9)

saya pikir "sihir" hanya <menyerang>operasi didahulukan</strike> urutan operasi

i += Increment(ref i)

adalah sama seperti

i = i + Increment(ref i)

yang + operasi dijalankan kiri ke kanan

jadi pertama kita mengambil saya ... yang adalah 0 pada waktu itu ...

kemudian kita tambahkan hasil dari Kenaikan(ref saya) ... yang juga 0 ... 0+0=0 ... tapi tunggu dulu ... sebelum kita mendapatkan hasil yang saya benar-benar bertambah ...

bahwa kenaikan terjadi setelah operan kiri dari kami + operasi ben dievaluasi ... jadi itu tidak mengubah apa ... 0+0 masih 0 ... dengan demikian saya ditugaskan 0 setelah + operasi yang telah dilaksanakan

Komentar (4)

Seperti yang anda sebutkan - postincrement "i". pernyataan - "return i++;," akan menetapkan nilai 'i' di memori setelah nilai asli dikembalikan.

coba gunakan "return ++i;," dan mungkin anda akan mendapatkan itu.

Komentar (1)