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?
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.
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