2011-04-19 2 views
1

C++의 std :: cout은 흥미로운 것으로 보입니다. 오늘 내 C++ 컴파일러에서 다음 프로그램을 시도 :std :: cout 혼합 된 이상한 출력

cout<<"!"<<"@"<<endl; 
cout<<"!"<<cout<<"@"<<endl; 
cout<<"!"<<(cout<<"@")<<endl; 

그리고 출력은 오히려 호기심 :

[email protected] 
[email protected] 
@!0x601068 

첫 번째 줄은 보행자; 두 번째는 이해할 수있다. 그러나 세 번째 줄은 내 지식을 초월합니다. 누군가가 결과를 설명 할 수 있습니까? 여러분 모두 미리 감사드립니다!

지야 오 웨이

답변

5

이 줄 :

cout<<"!"<<(cout<<"@")<<endl; 

처음 실행 :

(cout << "@") 

참고 : 다른 첫 뭔가를 실행 한 수 있지만, 컴파일러는이 하위 발현을 최적화하고이를 움직일 수 발견 제약 조건을 깨지 않고 진술의 시작 부분으로

이 표현식의 결과는 스트림 (cout)입니다. 그래서 결과 식입니다 :

cout<<"!"<< cout <<endl; 

이 결과 : 두 번째 라인을 이해한다면

@!<pointer> 
+0

당신이 서브를 일으키는 최적화라고 확신합니까? - 표현이 먼저 발생합니까? 나는 이것을 한 시퀀스 포인트라고 생각했다. – quamrana

+0

명령문의 시작과 끝에 시퀀스 포인트가 있습니다. 메소드를 호출하기 전후의 시퀀스 포인트 (주 : operator <<는 메소드 호출). 다른 모든 것들은 움직일 수 있습니다. 여기서 유일한 제한은'(cout << "@" ")'이 매개 변수로 사용되기 전에 완전히 평가되어야한다는 것이다. 날씨 이것은 첫 번째 메서드 호출이 컴파일러가 수행하는 최적화에 따라 달라지기 전이나 후에 수행됩니다. –

1

이 세 번째 줄은 삽입 연산자 인 구문 설탕을 보여줍니다.

기본적으로 (cout<<"@") 표현이 먼저 계산되어 @이되며 결과는 cout입니다.

처음에는 !이 뒤 따르고 cout으로 전송됩니다. 행

상당 :

operator<<(operator<<(operator<<(cout,"!"), (operator<<(cout,"@"))), endl); 
               ^------------------^ 

강조된 부분은 함수가 호출되기 전에 평가되어야 할 표현이다.

0

제 3 행의 괄호는 cout<<"@"을 먼저 실행하게하고, 행의 처음에 @을 넣습니다. 그런 다음 cout.operator<<("!")이 실행되어 !이 제자리에 놓입니다. 그리고 cout.operator<<("!")이 반환하는 ostreamoperator<<()이 실행되고 ostreamcout<<"@"이 반환되어 0x601068을 출력합니다.

0

, 왜 세 번째 혼동 당신은 무엇입니까?

먼저 괄호 안의 표현식이 평가되지만 (평가 순서는 지정되지 않음) 따라서 @이 표준 출력에 기록됩니다. 이러한 표현식은 항상 삽입 연산자에서 발생하는 것처럼 cout에 대한 참조를 반환합니다. 그렇지 않으면 체인을 연결할 수 없기 때문입니다.

이제 표현식의이 부분이 평가되었으므로 모든 것이 정상적으로 처리됩니다. 행의 내용은 왼쪽에서 오른쪽으로 씁니다. 먼저 !, 괄호 안의 표현식에서 반환 된 값입니다. cout하고 endl.

parenthes 다른 식으로 여기 평가 순서에 영향을
2

는 식 side-effects 있기 때문에, 그 부작용 발현 평가와 동일한 순서로 발생한다. (< <은 운영자이다) .