Avatar billede esbenp Nybegynder
31. maj 2006 - 00:00 Der er 6 kommentarer

Værdi af assignment

Hej. Kan nogen forklare denne ikke-intuitive opførsel for mig?

void f(int a,int b){
    printf("%d ", a);
    printf("%d ", b);
}

int hundred(){
    return 100;
}

//Denne main udskriver 200 12 12 12

int main(){
    int x;
    f(x*hundred(),x=12);
    f(x,x=12);
}

//Denne main udskriver 120 12 12 12 som forventet

int main(){
    int x;
    f(x*hundred(),x=12);
    f(x,x=12);
}

Kompilerer med gcc 3.4.2.

/Esben
Avatar billede bertelbrander Novice
31. maj 2006 - 00:05 #1
Hvad er forskellen på de to eksempler?

Du bruger x inden den har fået en værdi.
Avatar billede bertelbrander Novice
31. maj 2006 - 00:06 #2
Det sidste skulle være: Du bruger måske x inden den får en værdi. Du kan ikke vide om den evaluerer første eller andet argument først.
Avatar billede esbenp Nybegynder
31. maj 2006 - 00:21 #3
Det har du ret i. Hvis jeg ikke ganger hundred() på vil det sidste argument blive evalueret først.

Disse resultater giver mere overblik. Resultatet står i kommentaren.


int main(){
    int a,x,y,z;
    f(a=12,a); // 12 2
    f(z,z=12); // 12 12
    f(x=12,x*hundred()); // 12 300
    f(y*hundred(),y=12); // 2323232323 12
}

I anden linie ses det at andet argument bliver evalueret først. I fjerde linie går vi stadig ud fra andet argument bliver evalueret først, men det giver ikke det forventede resultat

/Esben
Avatar billede bertelbrander Novice
31. maj 2006 - 00:26 #4
Der er tale om "undefined behaviour", at forsøge at forstå eller forudse hvad der sker i disse tilfælde er frugtesløst.
Avatar billede esbenp Nybegynder
31. maj 2006 - 00:35 #5
Jeg har kigget lidt i assembler koden og jeg synes det ligner en underlig form for optimering.

Kaldet f(z,z=16666) vil generere denne kode. Læg mærke til konstanten 16666 optræder to gange i stedet for at læse den fra hukommelsen, hvilket også burde spare en read instruktion.

        movl    $16666, -16(%ebp)
        movl    $16666, 4(%esp)
        movl    -16(%ebp), %eax
        movl    %eax, (%esp)
        call    _f


/Esben
Avatar billede esbenp Nybegynder
31. maj 2006 - 00:38 #6
Det er også interessant at se at med -O3 på gcc vil den evaluere første argument først.

/Esben
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester