2015-01-14 22 views
5

std :: string'ten tamsayıları okumak için istringstreams kullanan çok basit bir test programım var. Kod: Ben bu Solaris 10 üzerinde çalıştırdığınızdaC++ Girdi akışı: Solaris vs Linux'taki işlem sırası

std::map<int, int> imap; 
int idx, value; 
std::string str("1 2 3 4 5 6 7 8"); 
istringstream is(str); 
while(is >> idx >> imap[idx]){ 
    cout << idx << " " << imap[idx] << endl; 
} 
cout << endl; 

std::map<int, int>::iterator itr; 
for(itr = imap.begin(); itr != imap.end(); itr++){ 
    cout << itr->first << " " << itr->second << endl; 
} 

, aşağıdaki çıktıyı üretir: Ben CentOS 7 altında çalıştırıldığında, Ancak

1 2 
3 4 
5 6 
7 8 

1 2 
3 4 
5 6 
7 8 

, alıyorum:

1 0 
3 0 
5 0 
7 0 

1 4 
3 6 
5 8 
7 0 
4204240 2 

Linux altında Solaris'in altında neden farklı olacağını herkes biliyor mu? Açıkçası haritadaki indeksi okumadan önce haritadaki değerin okunması, ama nedenini bilmiyorum. Ben biraz kod değiştirerek Linux altında çalışacak yapabilirsiniz:

std::map<int, int> imap; 
int idx, value; 
std::string str("1 2 3 4 5 6 7 8"); 
istringstream is(str); 
while(is >> idx >> value){ 
    imap[idx] = value; 
    cout << idx << " " << imap[idx] << endl; 
} 

std::map<int, int>::iterator itr; 
for(itr = imap.begin(); itr != imap.end(); itr++){ 
    cout << itr->first << " " << itr->second << endl; 
} 

Ben geçerli bir düzeltme olduğunu biliyorum, ama neden farklı olduğunu bilmek istiyorum çevremdeki insanlar var. Solaris'ten Linux'a geçiyoruz ve bunun gibi şeyler ortaya çıktığında nedenini bilmek istiyorlar. Nedenini bilmiyorum, bu yüzden rehberlik istiyorum.

+0

Bu bir makinede çalıştığı ve diğer bir deyişle, tanımlanmamış bir davranış olduğu anlamına gelir – smac89

+3

Burada da benzer işlem sırası siparişleri alındı, buradaki '' >> idx >> imap [idx] ifadesi, bir değişken değişkeni değerlendirir en az bir kez değiştirirken zamanlar. Http://stackoverflow.com/questions/4176328 adresine bakın. –

cevap

5
is >> idx >> imap[idx] 

Bu ifade birbirine unsequenced göreli olarak aynı işlevi için bağımsız değişken değerlendirmeler

operator>>(operator>>(is, idx), imap.operator[](idx)) 

eşdeğerdir; ya operator>>(is, idx) ya da imap.operator[](idx) ilk önce değerlendirilebilir (yani, is >> idx ya da imap[idx] ilk önce değerlendirilebilir). Eğer ikincisi ilk değerlendirilirse, sonuç, haritadaki değerine karşılık gelen değere atıfta bulunan bir değerdir; idx değerine karşılık gelen değer değil, ikinci okuma tarafından üzerine yazılacak olan değerdir.

Değiştirilen kod, numaralı telefondan idx okunmasını sağlayarak bunu düzeltir.