Pregunta

Sé que cout y printf tienen buffer hoy, y se dice que el buffer es como una pila y obtiene la salida de cout y printf de derecha a izquierda, luego los saca (a la consola o archivo) de arriba a abajo.Como esto,

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)

Luego escribo un código a continuación,

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

En VS2005, la salida es

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

En g++( (GCC) 3.4.2 (mingw-special)), el resultado es,

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

Parece que el búfer es como una pila.Sin embargo, leí Imprimación C++ Plus hoy, y se dice que el cout funciona de izquierda a derecha, cada vez que devuelve un objeto (cout), por lo que "Esa es la característica que le permite concatenar la salida mediante inserción".Pero de la manera de izquierda a la derecha no puede explicar Cout <Output 9 8 7 Ahora estoy confundido sobre cómo funciona el búfer de Cout, ¿alguien puede ayudarme?

¿Fue útil?

Solución

Esto no es un error ni tiene nada que ver con el almacenamiento en búfer de salida.

La orden de ejecución del i-- y i++ Las operaciones no están definidas cuando se invocan más de una vez como parámetros de la misma llamada de función.

Para elaborar (y posiblemente corregir) la mención que hace Iraimbilanja de los "puntos de secuencia", el cout versión es equivalente a:

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

Efectivamente, en realidad son tres llamadas a funciones separadas, cada uno de cuyos parámetros se evalúan en orden, aunque esté escrito como una sola declaración.

El << El operador es realmente ostream& operator<<(ostream& os, int), entonces otra forma de escribir esto es:

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

Dado que para la llamada externa no está (AFAIK) definido en qué orden se evalúan los dos parámetros, es perfectamente posible para el parámetro "c" de la derecha (o en su caso "i--") que suceda antes de que se evalúe el parámetro de la izquierda.

Otros consejos

La salida de:

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

no está especificado. Este es un error común de C ++: el orden de evaluación de argumentos no está especificado.

No es así con el caso cout: utiliza llamadas encadenadas (puntos de secuencia), no argumentos para una sola función, por lo que el orden de evaluación está bien definido de izquierda a derecha.

Editar: David Thornley señala que el comportamiento del código anterior es de hecho indefinido .

si es posible, intente actualizar a gcc > = 4. Acabo de ejecutar esto en 4.0.1 y se ejecuta de manera excelente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top