Cout 및 Printf의 버퍼 및 출력 시퀀스
문제
나는 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로 업데이트를 시도해보십시오.