문제

나는 Cout과 Printf가 오늘 버퍼를 가지고 있다는 것을 알고 있으며, 버퍼는 스택과 같으며 cout 및 printf의 출력을 오른쪽에서 왼쪽으로 가져온 다음 상단에서 Bottem까지 (콘솔 또는 파일로) 배치합니다. 이와 같이,

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)

그런 다음 아래 코드를 작성하고

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

VS2005에 따라 출력이 있습니다

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

g ++ ((GCC) 3.4.2 (mingw-special))에서 출력은

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

버퍼는 스택과 같습니다. 그러나 나는 읽었다 C ++ 프라이머 플러스 오늘은 왼쪽에서 오른쪽으로 Cout이 작동한다고 말하면서 객체 (Cout)를 반환 할 때마다 "삽입을 사용하여 출력을 연결할 수있는 기능"이라고합니다. 그러나 왼쪽에서 오른쪽으로는 Cout <output 9 8 7 이제 Cout의 버퍼 작동 방식에 대해 혼란스러워합니다. 누군가 나를 도울 수 있습니까?

도움이 되었습니까?

해결책

이것은 버그가 아니며 출력 버퍼링과 관련이 없습니다.

실행 순서 i-- 그리고 i++ 동일한 함수 호출의 매개 변수로 두 번 이상 호출 될 때 작업은 정의되지 않습니다.

Iraimbilanja의 "시퀀스 포인트"에 대한 언급, cout 버전은 다음과 같습니다.

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

효과적으로, 그것은 실제로 3 개의 개별 기능 호출이며, 각각의 매개 변수는 단일 진술처럼 작성되었지만 순서대로 평가됩니다.

그만큼 << 운영자는 실제로입니다 ostream& operator<<(ostream& os, int), 이것을 작성하는 또 다른 방법은 다음과 같습니다.

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

외부 호출의 경우 두 매개 변수를 평가하는 순서가 정의되지 않았으므로 오른쪽 "C"매개 변수 (또는 귀하의 경우”에 완벽하게 가능합니다.i--") 왼손 매개 변수가 평가되기 전에 발생합니다.

다른 팁

출력 :

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

지정되지 않습니다. 이것은 C ++의 일반적인 함정입니다. 인수 평가 순서는 지정되지 않습니다.

Cout Case에서는 그렇지 않습니다. 단일 함수에 대한 인수가 아니라 Chained Call (시퀀스 포인트)을 사용하므로 평가 순서는 왼쪽에서 오른쪽으로 잘 정의됩니다.

편집하다: David Thornley는 위의 코드의 동작이 실제로 한정되지 않은.

가능하다면 GCC> = 4로 업데이트를 시도해보십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top