Question

Je sais que cout et printf ont une mémoire tampon aujourd’hui, et on dit que la mémoire tampon est un peu comme une pile et obtenir la sortie de cout et printf de droite à gauche, puis les mettre (en haut à la console ou au fichier) à bottem. Comme ça,

a = 1; b = 2; c = 3;
cout<<a<<b<<c<<endl;
buffer:|3|2|1|<-   (take “<-” as a poniter)

output:|3|2|<-     (output 1)
        |3|<-       (output 2)
        |<-         (output 3)

Ensuite, j'écris un code ci-dessous,

#include <iostream> 
using namespace std; 
int c = 6;
int f() 
{   
    c+=1; 
    return c; 
} 

int main() 
{ 
     int i = 0; 
     cout <<"i="<<i<<" i++="<<i++<<" i--="<<i--<<endl; 
     i = 0;
     printf("i=%d i++=%d i--=%d\n" , i , i++ ,i-- );

     cout<<f()<<" "<<f()<<" "<<f()<<endl; 
     c = 6;
     printf("%d %d %d\n" , f() , f() ,f() );
     system("pause");
     return 0; 
} 

Sous VS2005, la sortie est

i=0 i++=-1 i--=0
i=0 i++=-1 i--=0
9 8 7
9 8 7

Sous g ++ ((GCC) 3.4.2 (mingw-special)), le résultat est,

i=0 i++=0 i--=1
i=0 i++=-1 i--=0
9 8 7
9 8 7

Il semble que le tampon ressemble à une pile. Cependant, je lis C ++ Primer Plus aujourd’hui, et on dit que le cout fonctionne de gauche à droite, chaque fois qu’il retourne un objet (cout), donc & «Cela & # 8217 ; s est la fonctionnalité qui vous permet de concaténer la sortie à l’aide de l’insertion " ;. Mais le chemin de gauche à droite ne peut expliquer cout & Lt; sortie 9 8 7 Maintenant, je ne comprends pas comment fonctionne le tampon de cout, quelqu'un peut-il m'aider?

Était-ce utile?

La solution

Ce n'est pas un bogue, cela n'a rien à voir avec la mise en mémoire tampon de la sortie.

L'ordre d'exécution des opérations i-- et i++ n'est pas défini lorsqu'elles sont appelées plusieurs fois en tant que paramètres du même appel de fonction.

Pour préciser (et éventuellement corriger) la mention par Iraimbilanja de & "; points de séquence &" ;, la version cout est équivalente à:

.
(((cout << a) << b) << c)

Effectivement, il s’agit en réalité de trois appels de fonction distincts, dont chacun des paramètres est évalué dans l’ordre, même s’il est écrit comme une seule instruction.

L'opérateur << est vraiment ostream& operator<<(ostream& os, int), donc une autre façon de l'écrire est:

operator<< ( operator<< ( operator<< ( cout, a ), b ), c )

Etant donné que l'appel externe n'est pas (AFAIK) défini dans quel ordre les deux paramètres sont évalués, il est parfaitement possible pour la main droite & "; c &"; paramètre (ou dans votre cas " <=> ") avant que le paramètre de gauche ne soit évalué.

Autres conseils

La sortie de:

printf("i=%d i++=%d i--=%d\n" , i , i++ ,i-- );

n'est pas spécifié. C ++ est un piège courant: l'ordre d'évaluation des arguments n'est pas spécifié.

Ce n’est pas le cas avec la casse cout: il utilise des appels chaînés (points de séquence), pas des arguments pour une seule fonction, donc l’ordre d’évaluation est bien défini de gauche à droite.

Modifier: David Thornley souligne que le comportement du code ci-dessus est en fait non défini .

Si possible, essayez de mettre à jour gcc > = 4. Je viens d'exécuter ceci sur la version 4.0.1 et il exécute simplement dandy.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top