2010-11-19 11 views
0

Olası Çoğalt: Her iki durumda da çıktı 2 2 2 var
FAQ : Undefined Behavior and Sequence PointsÖngörülemeyen çıkış

#include<iostream> 
#include<stdio.h> 
int main(){ 
    int myVal = 0; 
    printf("%d %d %d\n", ++myVal,myVal,++myVal); 
    myVal = 0 ; /*reset*/  
    std::cout<<++myVal<<" "<<myVal<<" "<<++myVal<<std::endl; 
    return 0; 
} 

. 2 2 2 nasıl olabilir? 2 1 1 veya 1 1 2

+7

oh hayır. tekrar olmasın. SO dizisinde 'dizi noktası'nı arayın ve cevabınızı alacaksınız. – Chubsdad

+6

[SSS: Tanımsız Davranış ve Sıra Noktaları] 'nın kopyası (http://stackoverflow.com/questions/4176328/faq-undefined-behavior-and-sequence-points – Naveen

+0

@Naveen: Teşekkürler. Günümüzde bu dizi 'dizi noktası' – Chubsdad

cevap

0

Beklenti operatörü gerçekten derlenir, böylece tüm çağrılar printf ve cout çağıran ifadeler değerlendirilmeden önce yürütülür.

Size varmış gibi açıklanmıştır:

int myVal = 0; 
myVal += 1; 
myVal += 1; 
printf("%d %d %d\n", myVal, myVal, myVal); 

Ayrıca bu derleyici optimizasyon sabit kullanmak kadar ileri gidebilir hayal olabilir '2' yerine bu durumda çalışma zamanında incrementations performans değeri.

düzenleme: diclaimer: Bu cevap, özellikle OP'nin kodunda ne olduğunu açıklamaya yönelik bir girişimdir, ancak derleyiciler bu durumda istedikleri kadar çok şey yapabildiklerinden, gerçekten tanımlanmamış davranışların bir örneğidir.

+1

Hayır, ama her cevap bu soruya gerçekten "undefined behaviour" kelimelerini içermelidir r "! –