2010-01-24 16 views
23

il seguente codice:cout << ordine di chiamata alle funzioni che stampa?

myQueue.enqueue('a'); 
myQueue.enqueue('b'); 
cout << myQueue.dequeue() << myQueue.dequeue(); 

stampe "ba" alla console

mentre:

myQueue.enqueue('a'); 
myQueue.enqueue('b'); 
cout << myQueue.dequeue(); 
cout << myQueue.dequeue(); 

stampe "ab" perché è questo?

Sembra che Cout stia chiamando prima la funzione più esterna (più vicina alla;) e che si sta facendo strada, è il modo in cui si comporta?

+0

dove sono andate tutte le risposte? ora ce n'è solo uno? – finiteloop

+1

Gli intervistati li hanno cancellati perché si sono resi conto che si sbagliavano. –

+1

Alcune persone eliminano le risposte quando scoprono che si sbagliano. –

risposta

28

Non esiste un punto di sequenza con l'operatore << in modo che il compilatore sia libero di valutare prima la funzione dequeue. Ciò che è garantito è che il risultato della seconda chiamata dequeue (nell'ordine in cui appare nell'espressione e non necessariamente nell'ordine in cui viene valutata) è <<'ed al risultato di << 'il primo (se prendi quello che sto dicendo).

Quindi il compilatore è libero di tradurre il tuo codice in qualcosa come uno di questi (pseudo intermedio C++). Questo non vuole essere un elenco esaustivo.

auto tmp2 = myQueue.dequeue(); 
auto tmp1 = myQueue.dequeue(); 
std::ostream& tmp3 = cout << tmp1; 
tmp3 << tmp2; 

o

auto tmp1 = myQueue.dequeue(); 
auto tmp2 = myQueue.dequeue(); 
std::ostream& tmp3 = cout << tmp1; 
tmp3 << tmp2; 

o

auto tmp1 = myQueue.dequeue(); 
std::ostream& tmp3 = cout << tmp1; 
auto tmp2 = myQueue.dequeue(); 
tmp3 << tmp2; 

Ecco quello che i provvisori corrispondono nell'espressione originale.

cout << myQueue.dequeue() << myQueue.dequeue(); 
|  |    | |    | 
|  |____ tmp1 _____| |_____ tmp2 ____| 
|      | 
|________ tmp3 _________| 
+0

quindi, nell'esempio in alto, sarebbe std :: ostream & tmp3 = cout << tmp1; tmp3 << tmp2; è come dire "cout << tmp1 << tmp2;"? O qualcosa che mi manca? – finiteloop

+0

@segfault: Sì, perché questo è il modo in cui << << 'si associa alla grammatica C++. 'a << b << c' sempre raggruppa come' (a << b) << c'. –

+0

ma con quella logica, non direbbe cout << a << b sta dicendo (cout << a) << b e fa tutto il necessario per cout un primo (cioè chiama myQueue.dequeue())? – finiteloop

6

La chiamata dal vostro esempio:

cout << myQueue.dequeue() << myQueue.dequeue(); 

traduce alla seguente espressione con due chiamate di operator<< funzione:

operator<<(operator<<(cout, myQueue.dequeue()), myQueue.dequeue()); 
-------------------- 1 
---------2 

L'ordine di valutazione di cout, myQueue.dequeue() non è specificato. Tuttavia, l'ordine delle chiamate di funzione operator<< è ben specificato, come indicato con 1 e 2

Problemi correlati