SORU
15 Ocak 2014, ÇARŞAMBA


::Garip std göster davranış

Aşağıdaki test programı

#include <map>
#include <iostream>

using namespace std;

int main(int argc, char **argv)
{
    map<int,int> a;
    a[1]=a.size();
    for(map<int,int>::const_iterator it=a.begin(); it!=a.end();   it)
            cout << "first " << (*it).first << " second " << (*it).second << endl;
}

g 4.8.1 (LT Ubuntu 12.04) üzerinde derlenmiş, farklı çıkış yol açar:

g   xxx.cpp 
./a.out 
first 1 second 1

ve Visual Studio 2012 (Windows 7) (Standart Win32 Konsol Uygulaması Proje):

ConsoleApplication1.exe
first 1 second 0

Hangi derleyici değil mi? Yanlış bir şey mi yapıyorum?

CEVAP
15 Ocak 2014, ÇARŞAMBA


Bu aslında aynı derecede geçerli iki yürütme yolları olan iyi oluşturulmuş bir programdır, her iki Derleyiciler değil.

a[1] = a.size()

Bu ifade, = iki işlenen değerlendirilmesi unsequenced.

§1.9/15 [intro.yürütme]Aksi belirtilmediği takdirde, bireysel ifadelerin taşıyıcının bireysel operatörleri ve işlenen değerlendirmeler unsequenced.

Ancak, işlev çağrıları aralanmış değildir operator[] size çağrıları aslındaindeterminately sıralı, unsequenced yerine.

§1.9/15 [intro.yürütme]Her değerlendirme arama işlevi (işlev çağrıları da dahil olmak üzere diğer) değil aksi özellikle sıralı önce veya sonra infaz vücut denen işlevdir indeterminately sıralı ile ilgili yürütme fonksiyonu denir.

Bu işlev çağrıları iki emir bir şey anlamına gelir:

  1. operator[] size
  2. size operator[]

Anahtar yok ve operator[] ile anahtar ararsan, harita, böylece haritanın boyutunu değiştirme eklenecektir. İlk durumda, anahtarı eklenecektir yani, boyutu alınacağını 1) ve 1 anahtar atanır. İkinci durumda, boyutu alınacağını 0), anahtar eklenir ve 0 anahtar atanır.

Not, bu tanımsız davranış beraberinde getiren bir durum değildir. Tanımsız davranış iki değişiklik veya modifikasyon ve aynı skaler nesnenin bir okuma unsequenced oluşur.

§1.9/15 [intro.yürütme]Eğer skaler bir nesne üzerinde bir yan etkisi aynı skaler nesne üzerinde başka bir yan etkisi ya da değer hesaplama aynı skaler nesnenin değeri kullanarak ya göre unsequenced, davranışı tanımsızdır.

Bu durumda, unsequenced ama indeterminately sıralı değiller.

Bu yüzden elimizdeki programın yürütülmesine eşit derecede geçerli iki sıralama. Ya da başına gelebilir ve her ikisi de geçerli çıkış ver. Bubelirsiz davranışlar.

§1.3.25 [defns.belirtilmemiş]
belirlenemeyen bir davranış
iyi oluşturulmuş bir program oluşturmak ve doğru veri biçimi, uygulamasına bağlıdır


Sorularınızı yanıtlamak için:

Hangi derleyici değil mi?

Her ikisi de.

Yanlış bir şey mi yapıyorum?

Muhtemelen. Böyle iki yürütme yolları var kod yazmak isteyeceğini pek olası değil. Belirsiz davranışlar gözlemlenebilir tek bir çıkış çözülebilir çünkü Tamam, tanımsız davranış farklı olabilir, ama eğer bunu önleyebilirsiniz Eğer en başta olması önemli değil. Bunun yerine, belirsizlik bu tür bir kod yazmak yok. Doğru yolda olmak istediğinize bağlı olarak, aşağıdakilerden birini yapabilirsiniz:

auto size = a.size();
a[1] = size; // value is 0

Ya da:

a[1];
a[1] = a.size(); // value is 1

Sonuç 1 olmak istiyorum ve anahtarı henüz yok biliyorsanız, tabii ki ilk kod ama size 1 atayabilirsiniz.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Android Authority

    Android Auth

    3 NİSAN 2011
  • magnum33563

    magnum33563

    8 NİSAN 2011
  • Stevie

    Stevie

    2 Mayıs 2010