SORU
22 Kasım 2012, PERŞEMBE


Ben = 0, bu yüzden (ben = ben ) 0?

Aşağıdaki kodu (bir Konsol Uygulaması olarak kullanılabilir):

static void Main(string[] args)
{
    int i = 0;
    i  = i  ;
    Console.WriteLine(i);
    Console.ReadLine();
}

i sonuç 0. 2 bazı meslektaşlarımın yaptığı gibi) bekliyordum. Muhtemelen derleyici i olmak sıfır sonuç bu yapı bir tür oluşturur.

2 beklediğim gibi akıl, fikir, sağ el ilk ifadesinde, 1 ile artan değerlendirilecek. Ben eklenir. Zaten 1, 1'e 1 eklemek, ben bu yana. Yani 1 1 = 2. Belli ki bu olmuyor.

Derleyici ne yapar veya zamanında ne olduğunu izah EDEBİLİR MİSİN? Neden sonuç sıfır mı?

Biraz tür--Yasal Uyarı: kesinlikle (ve muhtemelen olmamalı) bu kodu kullanmaz farkındayım. Ben asla olacak biliyorum. Yine de, bu şekilde davranır neden ve tam olarak ne olduğunu bilmek ilginç buluyorum.

CEVAP
22 Kasım 2012, PERŞEMBE


Bu:

int i = 0;
i  = i  

Gidiyor gibi görülebilir (aşağıdaki basitleştirme olur):

int i = 0;
i = i   i; // i=0 because the    is a postfix operator and hasn't been executed
i   1; // Note that you are discarding the calculation result

Aslında ne daha fazla dahil -, 21**: MSDN bir göz atın

Bu çalıştırma formu sonek artırma veya azaltma işlemi işleme x veya x-- aşağıdaki adımlardan oluşur:

  • Eğer x bir değişken olarak sınıflandırılır:

    • x değişkeni üretmek için değerlendirilir.
    • X değeri kaydedilir.
    • Seçilen operatör bağımsız değişken olarak x kayıtlı değeri ile çağrılır.
    • Değer operatör tarafından döndürülen konum x değerlendirilmesi tarafından verilen saklanır.
    • X kayıtlı değer işleminin sonucu olur.

order of precedence postfix nedeniyle oluştuğunu unutmayınönce =, ama sonuç kullanılmamış i önceki değeri kullanılır) olmak biter.


Daha kapsamlı bir ayrışma i = i parçaları olduğunu gerektirir bir biliyoruz ki, her iki = değil atom (ne olduğunu bir tek işlem bile benziyorlar. Bu sürekli bir biçimde geçici değişkenleri, işlemlerinin gerçekleşmesi için önce i kopya - her işlem için bir içerir. (İsimleri iAdd ve geçici değişkenleri = için kullanılan sırasıyla) iAssign kullanacağım.

Yani, ne olup bittiğini daha yakın bir yaklaşım olacaktır:

int i = 0;
int iAdd = i; // Copy of the current value of i, for   
int iAssign = i; // Copy of the current value of i, for  =

i = i   1; // i   - Happens before  = due to order of precedence
i = iAdd   iAssign;

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ecf150king

    ecf150king

    20 Ocak 2006
  • Ryan Billy

    Ryan Billy

    30 EKİM 2006
  • XxMinayaxX1

    XxMinayaxX1

    9 Mayıs 2012