Kısa Sınav – 14
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:
Ş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.
onun sebebi önce atama sonra azaltma yapılmasından kaynaklanıyor.
örneğin;
sonuç a = 10 olur sonra x in değeri 1 azalır
fakat aşağıdaki gibi olsa;
sonuç a = 9 olur çünkü önce x‘in değeri 1 azaltılıyor sonra a’ya atanıyor.
c dilinde cevap 19 dur.
inanmıyorsan turbo c yi aç dene
cevap:19
20 değil
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.
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ı
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.