Tanımlanmadı çünkü x
sıra noktaları arasında iki kez değişiklik yapıyor. Standart tanımsız olduğunu, bu nedenle tanımsız olduğunu söylüyor.
O kadarını biliyorum.
Ama neden?
Anladığım kadarıyla, bunun yasaklanması derleyicilerin daha iyi optimizasyon yapmasına izin veriyor. Bu, C icat edildiğinde mantıklı olabilirdi, ama şimdi zayıf bir argüman gibi görünüyor.
Bugün C'yi yeniden icat edersek, bunu bu şekilde yapar mıydık yoksa daha iyi yapılabilir mi?
Ya da belki bu tür ifadeler için tutarlı kurallar tanımlamayı zorlaştıran daha derin bir sorun var, bu yüzden onları yasaklamak en iyisidir?
Diyelim ki bugün C'yi yeniden keşfedeceğiz. x=x++
Mevcut kurallardan daha iyi çalıştığım gibi ifadeler için basit kurallar önermek istiyorum .
Mevcut kurallar veya diğer önerilerle karşılaştırıldığında önerilen kurallar hakkında görüşlerinizi almak istiyorum.
Önerilen Kurallar:
- Dizi noktaları arasında, değerlendirme sırası belirtilmemiştir.
- Yan etkiler hemen gerçekleşir.
Tanımlanmamış bir davranış söz konusu değildir. İfadeler bu değere veya buna göre değerlendirilir, ancak sabit diskinizi kesinlikle biçimlendirmez (garip bir şekilde, sabit diski biçimlendiren bir uygulama görmedim x=x++
).
Örnek İfadeler
x=x++
- İyi tanımlanmış, değişmezx
.
İlk olarak,x
artırılır (x++
değerlendirildiğinde hemen ), daha sonra eski değeri saklanırx
.x++ + ++x
-x
İki kat artar , değerlendirir2*x+2
.
Her iki taraf da ilk önce değerlendirilebilse de, sonuçx + (x+2)
(önce sol taraf) veya(x+1) + (x+1)
(önce sağ taraf) olur.x = x + (x=3)
- Belirtilmemiş,x
yax+3
da olarak ayarlayın6
.
Önce sağ taraf değerlendirilirse, olurx+3
. İlkx=3
olarak değerlendirilmesi de mümkündür , bu yüzden3+3
. Her iki durumda da,x=3
ödevx=3
değerlendirildiğinde hemen gerçekleşir , böylece saklanan değerin üzerine diğer ödev yazılır.x+=(x=3)
- İyi tanımlanmış,x
6'ya ayarlanır .
Bunun yukarıdaki ifade için sadece kısayol olduğunu iddia edebilirsiniz.
Ancak bunun iki bölümden+=
sonrax=3
değil, sonradan yürütülmesi gerektiğini söyleyebilirim ( yeni değeri okuyunx
, değerlendirinx=3
, ekleyin ve saklayın).
Avantajı Nedir?
Bazı yorumlar bu iyi noktayı dile getirdi.
Kesinlikle x=x++
herhangi bir normal kodda kullanılması gerektiği gibi ifadeler sanmıyorum .
Aslında çok daha sıkı daha değilim - Ben sadece iyi kullanımını düşünmek x++
olarak x++;
yalnız.
Ancak, dil kurallarının olabildiğince basit olması gerektiğini düşünüyorum. Aksi takdirde programcılar onları anlamıyor. sıra noktaları arasında bir değişkeni iki kez değiştirmeyi yasaklayan kural, çoğu programcının anlamadığı bir kuraldır.
Çok temel bir kural şudur:
A geçerliyse ve B geçerliyse ve geçerli bir şekilde birleştirildiyse, sonuç geçerlidir.
x
geçerli bir L-değeri, x++
geçerli bir ifade ve =
bir L-değeri ile bir ifadeyi birleştirmenin geçerli bir yoludur, peki nasıl olur x=x++
yasal değil?
C standardı burada bir istisna oluşturur ve bu istisna kuralları karmaşıklaştırır. Stackoverflow.com'da arama yapabilir ve bu istisnanın insanları ne kadar karıştırdığını görebilirsiniz.
Diyorum ki - bu karışıklıktan kurtulun.
=== Cevapların Özeti ===
Neden bunu yapıyorsun?
Yukarıdaki bölümde açıklamaya çalıştım - C kurallarının basit olmasını istiyorum.Optimizasyon potansiyeli:
Bu derleyiciden biraz özgürlük gerektiriyor, ancak beni önemli olabileceğine ikna eden hiçbir şey görmedim.
Çoğu optimizasyon hala yapılabilir. Örneğina=3;b=5;
, standart siparişi belirtmesine rağmen yeniden sıralanabilir. Gibi ifadelera=b[i++]
yine de benzer şekilde optimize edilebilir.Mevcut standardı değiştiremezsiniz.
Kabul ediyorum, yapamam. Aslında devam edip standartları ve derleyicileri değiştirebileceğimi hiç düşünmemiştim. Sadece işler farklı yapılabilirse düşünmek istedim.
x
Kendisine atamanın fazla bir anlamı yoktur ve eğer arttırmakx
istiyorsanız sadece söyleyebilirsinizx++;
- ödeve gerek yoktur. Sadece ne olması gerektiğini hatırlamak zor olacağı için tanımlanmaması gerektiğini söyleyebilirim .