Frage

Ich weiß, cout und printf heute haben Puffer, und es wird gesagt, dass der Puffer einige wie ein Stapel ist und die Ausgabe von cout und printf von rechts nach links bekommen, so dass sich dann (auf die Konsole oder Datei) von oben löschen bottem. Wie diese

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)

Dann schreibe ich einen Code unten,

#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; 
} 

Unter VS2005, der Ausgang ist

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

Unter g ++ ((GCC) 3.4.2 (mingw-special)), die Ausgabe ist,

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

Es scheint, dass der Puffer wie ein Stapel ist. Allerdings habe ich gelesen, C ++ Primer plus heute, und es wird gesagt, dass die cout Arbeit von links nach rechts, kehrt jedes Mal ein Objekt (cout), so „dass die Funktion ist, die Sie Ausgabe verketten, indem Sie läßt insertion“. Aber die von links nach rechts Art und Weise kann nicht erklären, cout

War es hilfreich?

Lösung

Dies ist kein Fehler, noch ist es etwas mit Ausgabepufferung zu tun.

Die Reihenfolge der Ausführung der i-- und i++ Operationen definiert ist, nicht, wenn sie mehr als einmal als Parameter an den gleichen Funktionsaufruf aufgerufen sind.

Um dies näher auszuführen (und ggf. korrigieren) Iraimbilanja der Erwähnung von „Sequenzpunkten“, die cout Version entspricht:

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

Tatsächlich ist es eigentlich drei getrennte Funktionsaufrufe werden, um jeweils deren Parameter ausgewertet, auch wenn es wie eine einzige Anweisung geschrieben ist.

Der << Operator ist wirklich ostream& operator<<(ostream& os, int), so ein anderer Weg, dies zu schreiben, ist:

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

Da für den äußere nennt es ist nicht (AFAIK) definiert, die die beiden Parameter ausgewertet werden, ist es durchaus möglich, die rechten „c“ Parameter (oder in Ihrem Fall „i--“) geschehen, bevor der linken Parameter ausgewertet wird.

Andere Tipps

Die Ausgabe von:

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

ist nicht spezifiziert. Dies ist ein häufiger Fehler von C ++. Argumente Auswerteauftrag nicht spezifiziert ist

Nicht so mit dem cout Fall. Es verwendet gekettet Anrufe (Sequenz Punkte), nicht Argumente zu einer einzigen Funktion, so wird Auswerteauftrag auch von links nach rechts definiert

Edit: David Thornley weist darauf hin, dass das Verhalten des obigen Codes ist in der Tat undefiniert .

möglich, wenn versuchen, gcc Aktualisierung> = 4 i dies nur auf 4.0.1 lief und es führt nur Dandy.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top