SORU
10 ŞUBAT 2014, PAZARTESİ


Neden f(i = -1, i = -1) tanımsız davranıştır?

order of evaluation violations, hakkında bir kitap okuyordum ve bir örnek bana ilginç veriyorlar.

1) skaler bir nesne üzerinde bir yan etkisi BM-sıralı aynı skaler nesne üzerinde başka bir yan etkisi göre, davranışı tanımsızdır.

// snip
f(i = -1, i = -1); // undefined behavior

, i Bu bağlamdaskaler nesnegörünüşe göre demektir .,

Aritmetik türleri (3.9.1), sayım tipleri, işaretçi tipleri, işaretçi üyesi türleri (3.9.2), std::nullptr_t ve cv nitelikli bu türden sürümleri (3.9.3) topluca denir skaler tipler.

Deyimi bu durumda belirsiz nasıl görmüyorum. Eğer birinci ya da ikinci argüman ilk olarak, i biter ** 6, ve her iki bağımsız değişken olarak değerlendirildiği için, ne olursa olsun da -1 gibi geliyor bana.

Kimse açıklamak lütfen?


GÜNCELLEME

Gerçekten tüm tartışma için minnettarım. Şimdiye kadar, ilk bakışta nasıl göründüğünü rağmen bu deyimi tanımlama tuzaklar ve inceliklerini ortaya koyar bu yana @harmic’s answer çok seviyorum. @acheong87 başvurular kullanırken gelip bazı sorunları işaret eder, ama bu soru unsequenced yan etkileri yönüne dik bence.


ÖZET

Bu soru dikkatini bir sürü var bu yana, cevaplar/ana noktaları özetler. İlk olarak, bana işaret küçük olacağı izin "neden" yakından henüz kurnazca farklı anlamları ile ilgili olabilir, "ne için . yani ^em>neden", "ne içinnedeni"ve "ne içinamaç". Bu anlamda, "neden ele". cevapları grup edeceğim

ne için neden

Asıl cevap burada Martin J benzer ama o kadar kapsamlı bir cevap katkıda bulunmak Paul Draper gelir. Paul Draper cevabı aşağı kaynar

Bu davranış ne tanımlı değil çünkü tanımsız davranıştır.

Cevap genel olarak C standart dediğini açıklamak açısından çok iyi. Ayrıca f( i, i); f(i=1, i=-1); İK gibi bazı vakalar adresleri. İlk ilgili davalar, değil net Eğer ilk argüman olmalı i 1 ikinci i 2 ya da tam tersi; ikincisi, değil açık i olmalı 1 veya -1 sonra işlevini çağırın. Bu durumların her ikisi de aşağıdaki kural altında düşüş nedeniyle İK

Eğer skaler bir nesne üzerinde bir yan etkisi aynı skaler nesne üzerinde başka bir yan etkisi göreceli unsequenced, davranışı tanımsızdır.

Bu nedenle, f(i=-1, i=-1) aynı kural altında düşüyor beri de İK, buna rağmen programcı niyeti (IMHO) açık ve net.

Paul Draper da onun sonucu bu açık hale getirir

Tanımlanan davranış olabilir mi? Evet. Oldu tanımlanmış? Hayır.

"ne sebep/amaç için f(i=-1, i=-1) tanımsız davranış olarak kaldı?"

amaç / ne için

Bazı karşılaştıklarını (belki) dikkatsiz C standart olmasına rağmen, birçok eksiklikler iyi gerekçeli ve belirli bir amaca hizmet eder. Amaç genellikle ya farkında olmama rağmen "derleyici-yazar işini kolaylaştırmak" ya da "hızlı kodu",Özellikle eğer iyi bir neden izin olup olmadığını merak ediyordumf(i=-1, i=-1)İK olarak.

harmic supercat sağlayan ana cevaplar verinnedenibu İK için. Harmic görünürde atom atama dağılır diye bir optimize derleyici birden fazla makine talimatları içine işlemleri ve daha optimal hız için bu talimatları aralığı olabilir dikkat çekiyor. Bu çok şaşırtıcı bazı sonuçlara neden olabilir: i sonunda adamın senaryoda -2 gibi! Böylece, harmic atama gösterilmiştiraynı değerbir değişken için birden fazla işlemleri unsequenced eğer kötü etkileri olabilir.

supercat f(i=-1, i=-1) yapmak lazım gibi görünüyor ne yapmak tuzaklar ilgili bir açıklama sağlar. O bazı mimarileri, aynı bellek adresi aynı anda birden çok yazar karşı sert kısıtlamalar var olduğuna dikkat çekiyor. Bir derleyici zor bir şey f(i=-1, i=-1) daha az önemsiz ile karşı karşıya olduğumuzu eğer bu alıcı olabilir.

davidf ayrıca bir talimata gerek harmic çok benzer binişimi bir örnek sağlar.

Harmic her şey, supercat rağmen ve davidf' örnekler biraz yapmacık, birlikte onlar hala f(i=-1, i=-1) tanımsız davranışlara neden somut bir neden sağlamak için hizmet alınır.

Paul Draper cevap" bölümünü daha iyi. çünkü ne "ele rağmen neden tüm anlamları ele iyi iş yaptı çünkü harmic cevabı kabul ettim,

diğer cevaplar

JohnB eğer aşırı atama operatörleri (sadece düz skaler yerine) düşünürsek, o zaman sorun içine çalıştırabilirsiniz dikkat çekiyor.

CEVAP
10 ŞUBAT 2014, PAZARTESİ


İşlemleri unsequenced olduğundan, yönergeleri atama olamaz gerçekleştirme aralanmış olmasını söyleyecek bir şey yok. Bunu yapmak için en uygun İŞLEMCİ mimarisi bağlı olabilir. Belirtilen sayfada bu devletler:

Eğer A B ve B önce Bir, sonra sıralı değil sıralı değil iki olasılık var:

  • ve B unsequenced Bir değerlendirme: herhangi bir sırada yapılabilir ve olabilir (tek bir yürütme iş parçacığı içinde, üst üste derleyici CPU A ve B oluşturan talimatları) boşluk olabilir

  • ve B indeterminately-sıralı Bir değerlendirme: olabilir ama üst üste herhangi bir sırada yapılabilir: ya tam olacak B önce veya sipariş olabilir A. önce tamamlanmış olacak B bir sonraki sefer karşısında aynı ifade değerlendirilir.

Tek başına bir sorun - gerçekleştirilen işlem bir bellek konumu içine -1 değeri saklamak olduğunu varsayarsak neden olacak gibi görünmüyor. Ama orada da bir şey söylemek derleyici optimize edemiyor o ayrı bir set talimatları aynı etkiye sahiptir, ancak başarısız olabilir ameliyat oldu aralanmış ile başka bir operasyon aynı bellek konumu.

Örneğin, daha verimli hafıza sıfır, eksiltme, değerini -1 yükleme ile karşılaştırıldığında sonra olduğunu hayal edin. Bu daha sonra:

f(i=-1, i=-1)

olabilir:

clear i
clear i
decr i
decr i

Şimdi -2 ben.

Muhtemelen sahte bir örnektir, ama mümkündür.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • A Alkhaldi

    A Alkhaldi

    12 Mayıs 2007
  • Jared Busch

    Jared Busch

    25 Mayıs 2011
  • Lancome USA

    Lancome USA

    30 HAZİRAN 2009