Ordine delle esecuzioni negli stream C ++

2

È ovvio che le prime stampe cout 7 7 ma perché la seconda stampa 8 8 7? Perché non 7 8 8? Come funzionano tali costruzioni in c ++?

int ink(int *x){
     *x += 1;
     return *x;
}
int main(){
    int *a;
    int b = 6;

    a = &b;

    cout << ++b << " " << b << endl;   
    cout << b << " " << ink(a) << " " << b;

    return 0;

}

    
posta Krzysztof Bzowski 29.11.2012 - 15:02
fonte

2 risposte

3

Perché il codice contiene effetti collaterali. Non puoi essere sicuro in quale ordine verranno eseguiti gli elementi.

Ecco alcune informazioni in più: link

EDIT: Ecco l'output sulla mia macchina:

7 6
8 8 7

Come puoi vedere è diverso dal tuo. L'approccio corretto consiste nel fare tutti i calcoli prima del cout e quindi passare solo i valori.

    
risposta data 29.11.2012 - 15:09
fonte
2

Potrebbe essere più facile capire cosa sta succedendo se si guarda alla catena di chiamate di funzioni a cui il secondo si rivolge (sto usando l'operatore defs qui , che corrispondono alle intestazioni gcc sul mio sistema):

cout << b << " " << ink(a) << " " << b;

operator<<(operator<<(cout.operator<<(b)," ").operator<<(ink(a)), " ").operator<<(b);

A parte questo sembra molto strano perché gli inserter numerici sono tutti metodi dell'oggetto, mentre gli inserters di stringa di caratteri sono tutte funzioni globali, il che rende l'ordine delle chiamate ancora più strano di quanto potrebbe essere.

Ora che hai l'effettiva catena di chiamate, puoi vedere come finirebbe a mettere il 7 in pila prima della chiamata 'inchiostro', ma in realtà non lo useremo fino a molto tempo fa, causando così il non-intuitivo uscite.

    
risposta data 29.11.2012 - 15:56
fonte

Leggi altre domande sui tag