Programdaki işlem yanlış mı?

Katılım
6 Haziran 2019
Mesajlar
805
Çözümler
6
Herkese merhaba...

PDF üzerinden bir anlatım okurken şöyle bir kare ile karşılaştım ve son satırı bana aşırı saçma geldi. Bence burada bir yanlışlık var fakat tam olarak emin değilim lütfen yardımcı olur musunuz?

Aşağıda görmüş olduğunuz resimde "Bunu şu işlemlerle daha kolay açıklayabiliriz" yazısının altında gördüğünüz gibi 4 satırlık bir işlem var. Bu satırların her birini yukarıdan aşağıya doğru 1. satır, 2. satır, 3. satır ve 4. satır olarak ayırırsak. 4. satırda bir terslik var. Ya da bana öyle geldi bilmiyorum zaten bu sorunun cevabını öğrenmek için açtım bu konuyu.

Şimdi gelelim soruna...

4. satırda; X = 5 iken X++ * X++ = 30 demiş hemen sağında da //[5 * 6 = 30] demiş yani X ilk değerini koruyup 5 olarak kalmış çünkü ilk olarak sonal operatör devreye girmiş, daha sonra 6 olmuş ve 5 ile 6'nın çarpımından 30 sayısını elde etmiş, fakat hemen sağında X = 7 olur. yazılmış. Ben burada şunu anlamadım. 1.,2. ve 3. satırlarda X her zaman son değeri olarak kalırken burada nasıl 6 değil de 7 oluyor?

screenshot-www.baskent.edu.tr-2021-06-19-02-53-59-990.png
 
Son düzenleyen: Moderatör:
x++ yazan yerde x'in o anki değeri kullanılır, ama işlem bittiği an değeri artırılır. Bu yüzden ilk x++'nın değeri 5 olur ama o bittiği an, yani * işaretine geçildiği an x 6 olur.
Şimdi yukarıdaki paragrafı tekrar oku çünkü ikinci için de aynı şey geçerli.

Adam bunu anlatmış ama yanlış anlatmış. İki x++ işaretinde de x'in değeri artırılır ama o satırda x hep 5 olur. Yani o işlemin cevabı 25, x'in sonraki değeri ise 7 olur.

Kod olarak yazıp görebilirsin.

Ve 3. satırla 4. satır arasında fark yok. Buradan adamın anlattığında bir sıkıntı olduğunu görebilirsin. Birinde 5'ten bir eksik sayı çıkarken diğerinde iki fazla çıkıyor.

Sanmıyorum ama davranışı dilden dile değişebilir, hatta compiler'dan compiler'a. Yani 30 sonucu doğru ama yanlış. Yine de üçüncü satırda 4, dördüncü satırda 7 gelmesine imkan yok.
 
Son düzenleme:
Bu operatörlerin kullanımı sakıncalı. Döngü harici yerlerde özellikle bu şekilde kullanımı kötü bir pratik. Fakat mantığını şöyle anlatabilirim.

Prefix şeklinde kullanılırsa program, sayıyı kullanmadan önce işlemi yapar ve sonra kullanır. Suffix olur ise sayıyı kullanır ve hemen ardından sayıya işlemi yapar.

++x -> önce bir arttır ve sonra x'i arttırılmış halde kullan. (Prefix)
x++ -> x'i kullan ve hemen sonra bir arttır. Devamındaki işlemlerde bir artmış şekilde bulunur. (Suffix)

Son satıra gelirsek. Hata yok. x++ * x++ işlemi başta 5'i kullanır ve sonra arttırır. Sağdaki sayıya gediğinde de arttırıldığı için 6 olur. Sayı 6 olarak kullanılır fakat 7'ye arttırılır. Çünkü suffix olarak ++ var. Yani 5*6 olur fakat işlem sonunda x içerisinde 7 sayısı bulunur.

Ama üçüncü satırda 4, dördüncü satırda 7 gelmesine imkan yok.
Evet üçüncü satırda x'in değeri hatalı fakat dördüncü satır doğru.
 
Son düzenleme:
Bu operatörlerin kullanımı sakıncalı. Döngü harici yerlerde özellikle bu şekilde kullanımı kötü bir pratik. Fakat mantığını şöyle anlatabilirim.

Prefix şeklinde kullanılırsa program, sayıyı kullanmadan önce işlemi yapar ve sonra kullanır. Suffix olur ise sayıyı kullanır ve hemen ardından sayıya işlemi yapar.

++x -> önce bir arttır ve sonra x'i arttırılmış halde kullan. (Prefix)
x++ -> x'i kullan ve hemen sonra bir arttır. Devamındaki işlemlerde bir artmış şekilde bulunur. (Suffix)

Son satıra gelirsek. Hata yok. x++ * x++ işlemi başta 5'i kullanır ve sonra arttırır. Sağdaki sayıya gediğinde de arttırıldığı için 6 olur. Sayı 6 olarak kullanılır fakat 7'ye arttırılır. Çünkü suffix olarak ++ var. Yani 5*6 olur fakat işlem sonunda x içerisinde 7 sayısı bulunur.


Evet üçüncü satırda x'in değeri hatalı fakat dördüncü satır doğru.
O zaman bu halde 3. satırda x son değer olarak x = 3 değerini alıyor.
 
Hata var ama 3. satırda, sonunda x=3 olmalı, orada 4 yazdığı için yanlış anlamışsın ve hata 4. satırda sanmışsın. 4. satırdaki işlem doğru ama 3. satırda yanlış yazılmış. Ayrıca işlem bittikten sonra arttırma ve eksiltme yapacağı için işlem sonucu 25 çıkar.
 
Son düzenleme:
Sanmıyorum ama davranışı dilden dile değişebilir, hatta compiler'dan compiler'a.
Yanlış sanmışım. Bayağı öyleymiş. Kod bozuk. Kötü kod.

Bu içeriği görüntülemek için üçüncü taraf çerezlerini yerleştirmek için izninize ihtiyacımız olacak.
Daha detaylı bilgi için, çerezler sayfamıza bakınız.
 

Geri
Yukarı