2015-01-14 3 views
4

방지 :C++ 예외는 다음 코드에서 cout을 인쇄

#include <iostream> 
using namespace std; 

int f() 
{ 
    throw 1; 
} 

int main() 
{ 
    try 
    { 
     cout << "Output: " << f() << endl; 
    } 
    catch (int x) 
    { 
     cout << x; 
    } 
} 

"Output: "가 인쇄되지 않는 이유는 무엇입니까? 을 operator<<(cout, f()) 전에 호출해야합니까? 선이 원 자상이라면, 어떻게 인쇄가 뒤집니까?

+0

왜'cout'이 이와 같은 배포 속성을 사용한다고 생각하십니까? 모든 주장이 먼저 평가되는 것이 더 합리적이지 않습니까? – PaulMcKenzie

+0

f()가'operator << (cout, "Output :")'전에 평가 될 수 있다는 사실을 무시했습니다. 나는 논쟁이 왼쪽에서 오른쪽으로 평가 될 것이라고 생각했다. –

답변

7

< < 연산자에 대한 인수 평가 순서가 C++ 표준에 정의되어 있지 않습니다. 실제로 인쇄하기 전에 컴파일러가 모든 인수를 먼저 평가하는 것처럼 보입니다.

+0

연산자 '<<'뿐만 아니라, 단일 문에서 두 표현식 모두에 해당합니다. 맞습니까? 그래서 우리는'int i = 0; std :: cout << ++ i << "\ n"<< i ++ << ""\ n ";','int i = 0; f (i ++, i ++); 또는 속담'int i; i = i ++ + ++ i;'. – 5gon12eder

+1

@ 5gon12eder 정확히는 아닙니다. * 시퀀스 포인트 *입니다. 더 많은 정보를 찾아 볼 수 있습니다. 그러나 실제로 종종 그렇습니다. – Quentin

+1

@Quentin 예, 시퀀스 포인트를 도입하지 않는 단일 명령문 (올바른 단어가되기를 희망 함)을 추가해야합니다. – 5gon12eder

2

그것은 operator<<(operator<<(operator<<(cout, "Output:"), f()), endl)로 조립되고 호출 실제 연산자 함수에 대해 생각하는 데 도움이 될 수 있습니다 : 함수 인수가 먼저 평가되는에 대해 어떤 요구 사항은 없다 : 당신은 operator<<(cout, "Output:")f()operator<<의 또 다른 호출에 두 함수 인자가있는 것을 볼 수 있습니다.