2010-01-24 2 views
23

cout << 인쇄되는 함수에 대한 호출 순서?

다음 코드는 다음과 같습니다.

myQueue.enqueue('a'); 
myQueue.enqueue('b'); 
cout << myQueue.dequeue() << myQueue.dequeue(); 

콘솔에 "ba"를 인쇄합니다.

while :

myQueue.enqueue('a'); 
myQueue.enqueue('b'); 
cout << myQueue.dequeue(); 
cout << myQueue.dequeue(); 

는 "ab"를 인쇄합니다.

마치 가장 가까운 (;에 가깝다) 함수를 가장 먼저 호출하고 그 방법을 사용하고있는 것처럼, 그것이 동작하는 것처럼 보입니다.

+0

으로 표시된 operator<< 함수 호출의 순서는 잘 지정되어 있습니다. 모든 응답은 어디로 갔습니까? 지금은 단 하나 뿐인가? – finiteloop

+1

답변자가 실수로 인해 응답자가이를 삭제했습니다. –

+1

어떤 사람들은 잘못되었을 때 대답을 삭제합니다. –

답변

28

<< 연산자에는 시퀀스 포인트가 없으므로 컴파일러는 먼저 dequeue 함수를 자유롭게 평가할 수 있습니다. 보장되는 것은 두 번째 dequeue 호출의 결과 (표현식에 나타나는 순서와 반드시 평가되는 순서가 아님)가 <<이고 결과가 << 인 경우입니다. 내가 말하는 것을 얻으십시오).

그래서 컴파일러는 코드를 자유롭게 (pseudo intermediate C++) 같은 코드로 변환 할 수 있습니다. 이것은 철저한 목록이 아닙니다.

auto tmp1 = myQueue.dequeue(); 
std::ostream& tmp3 = cout << tmp1; 
auto tmp2 = myQueue.dequeue(); 
tmp3 << tmp2; 

auto tmp2 = myQueue.dequeue(); 
auto tmp1 = myQueue.dequeue(); 
std::ostream& tmp3 = cout << tmp1; 
tmp3 << tmp2; 

또는

auto tmp1 = myQueue.dequeue(); 
auto tmp2 = myQueue.dequeue(); 
std::ostream& tmp3 = cout << tmp1; 
tmp3 << tmp2; 

또는

다음은 임시직 원래 식에 해당하는 것입니다.

cout << myQueue.dequeue() << myQueue.dequeue(); 
|  |    | |    | 
|  |____ tmp1 _____| |_____ tmp2 ____| 
|      | 
|________ tmp3 _________| 
+0

그래서 위 예제에서 std :: ostream & tmp3 = cout << tmp1; tmp3 << tmp2; "cout << tmp1 << tmp2;"라고 말하고 싶으십니까? 아니면 내가 놓친 거있어? – finiteloop

+0

@segfault : 예, 이것이 C++ 문법에서'<<'연관시키는 방식이기 때문입니다. 'a << b << c'는 항상'(a << b) << c'로 그룹화됩니다. –

+0

하지만 그 논리에 의해 cout << a << b (cout << a) << b라고 말하면서 첫 번째 (즉, myQueue.dequeue())를 호출하는 데 필요한 작업을 수행합니까? – finiteloop

6

귀하의 예제에서 전화 :

cout << myQueue.dequeue() << myQueue.dequeue(); 

operator<< 기능이 호출로 다음과 같은 표현으로 변환합니다 cout의 평가

operator<<(operator<<(cout, myQueue.dequeue()), myQueue.dequeue()); 
-------------------- 1 
---------2 

순서, myQueue.dequeue()은 지정되지 않습니다. 그러나 12