Ana Sayfa > C#, Programlama > Kısa Sınav – 14

Kısa Sınav – 14

18 Şubat 2010

Kısa bir soru;

var x = 10;

x += x- -;

x değeri ne olur?

Sorunun doğru cevabı için;

Cevap 19 değil. Doğru cevap 20 olmalı.

Neden 20 olduğunu ben de tam olarak bilmiyorum, ama IL koduna baktığımızda aşağıdaki sonucu görüyoruz;

ldc.i4.s 10 ; [10]
stloc.0     ; []
ldloc.0     ; [10]
ldloc.0     ; [10, 10]
dup         ; [10, 10, 10]
ldc.i4.1    ; [10, 10, 10, 1]
sub         ; [10, 10, 9]
stloc.0     ; [10, 10]
add         ; [20]
stloc.0     ; []

x değişkeni işlem sonucunda 20 değerine sahip gözüküyor. Yorumlarınızı bekliyorum.


İlgili diğer başlıklar:



  1. Şubat 19th, 2010 at 09:44 | #1

    Şurada artırma ve azaltma işlemlerinin c# tarafında nasıl ele alındığı ile ilgili kısa bir bilgi var;

    Expression Operation Interpretation
    j = ++k; Preincrement k = k + 1; j = k;
    j = k++; Postincrement j = k; k = k + 1;
    j = –k; Predecrement k = k – 1; j = k;
    j = k–; Postdecrement j = k; k = k – 1;

    Benim görüşüm, artırma ya da azaltma operatörünün değişkenin sağında kullanıldığı durumlarda atama işleminin önceliğe sahip olması, dolayısıyla önce atama yapması ve artırma/azaltma işlemi yapılsa dahi eski değişken var olmadığından işlemin geçerliliğini yitirmesi yönünde.

  2. Veysel
    Nisan 12th, 2010 at 23:58 | #2

    onun sebebi önce atama sonra azaltma yapılmasından kaynaklanıyor.

    örneğin;

    x = 10;
    a = x--;

    sonuç a = 10 olur sonra x in değeri 1 azalır

    fakat aşağıdaki gibi olsa;

    a = --x;

    sonuç a = 9 olur çünkü önce x‘in değeri 1 azaltılıyor sonra a’ya atanıyor.

  3. abdullah
    Temmuz 16th, 2010 at 15:43 | #3

    c dilinde cevap 19 dur.
    inanmıyorsan turbo c yi aç dene
    cevap:19
    20 değil

  4. gokhan gumus
    Mart 30th, 2011 at 10:13 | #4

    performansla ilgili bir kaygı yoksa neden böyle kodlar yazılır ki;

    en kafa ağrıtmayanı :
    x=x-1; // veya x–
    x=x+1; // veya x++

    bunun dışında varsayılan davranışa göre kod düzeltilir.

  5. Nisan 18th, 2011 at 11:04 | #5

    int x = 10;
    x += x–;
    this.Text = x.ToString();
    sonuc = 20 ‘ çünkü ilk önce işlem yaptı

    benimde dikkatimi çekti ufak bir açıklama yapma ihtiyacı duydum.

    eger x’in yani değişkenin sol tarafında olursa ilk once eksiltir ve işleme koyar ama sağ tarafında olursa ilk once işleme koyar ve daha sonra eksiltir.

    int x = 10;
    x += –x;
    this.Text = x.ToString();
    sonuc = 19 ilk önce eksiltti sonra topladı

  6. mehmet
    Kasım 24th, 2011 at 18:25 | #6

    Benim yorumum şu şekilde, öncelikle yapılan her işlemin sonucunun bizim görmediğimiz geçici bellek bölgelerinde tutulduğunu düşünelim.

    x += x–;

    x = x + x–;

    d = x + x; // sağ bölümün sonuçları geçici bellek alanlarına alınıyor.
    e = x – 1;

    x = e; –> öncelikle sağ tarafı bitiriyoruz. bu noktada x, 9 değerini alıyor.
    x = d; –> ancak sonraki adımda 20 atandığı için son değer 20 kalıyor.

    sonuçtan çözüme giden bir yaklaşım oldu =) doğruluğu konusunda emin değilim.