2010-03-21 5 views
3

스트림 삽입 연산자의 연관성은 rtl입니다.이 사실을 잊어 버리면 런타임 또는 논리 오류가 발생할 수 있습니다. 예를 들어 는 :무엇이 잘못 되었습니까? 연관성? 평가 명령? 주문을 변경하는 방법?

주요 기능에 1st-

int F() 
{ 
    static int internal_counter c=0; 
    return ++c; 
} 

:

//....here is main() 
cout<<”1st=”<<F()<<”,2nd=”<<F()<<”,3rd=”<<F(); 

출력입니다 : 우리가 처음에 예상과 다른

1st=3,2nd=2,3rd=1 

보기.

// 
    //... a Stack<DataType> class …… 
    // 

    Stack<int> st(10); 
    for(int i=1;i<11;i++) 
     st.push(i); 

cout<<st.pop()<<endl<<st.pop()<<endl<<st.pop()<<endl<<st.pop()<<endl; 

예상 출력이 뭔가 같은 :

10 
9 
8 
7 

하지만 우리가 가진 :

7 
8 
9 
10 

2nd- 우리가이 같은 스택 데이터 구조의 구현을 가지고 있다고 가정

<의 내부 버그가 없습니다.구현하지만 너무 혼란 스러울 수 있습니다 ... 그리고 마지막으로 [:-)] 내 질문 : 거기에 오버로드하여 연산자의 연관성을 변경할 수있는 방법이 있습니까?

이것이 역행 할 수 있다고 생각하십니까? 내 말은 오픈 소스 STL을 수정하거나 변경하여 주문을 변경할 수 있습니까?

답변

5

오른쪽 연관성이있는 것은 할당 연산자뿐입니다. 표준의 §5.4 ~ 5.18을 참조하십시오. << 연산자는 왼쪽에서 오른쪽으로 평가되거나 메시지가 내용이 아닌 문법적으로 뒤에서 평가됩니다. 내용은 부작용으로 인한 것입니다. C++에서는 "단락"& & 및 || 및 쉼표 (Neil 언급)를 제외하고는 순서가 없습니다.

int a = st.pop(); 
int b = st.pop(); 
int c = st.pop(); 
cout << a << endl << b << endl << c << endl; 
+0

@Sorush을 : – Potatoswatter

10

아니요. 하지만 당신이 평가 순서와 연관성을 뒤죽박죽이라고 생각합니다. 평가 순서를 지정하는 유일한 연산자는 & &, || 및 (쉼표). 당신이 말할 때 :

cout<<st.pop()<<endl<<st.pop()<<endl<<st.pop()<<endl<<st.pop()<<endl; 

컴파일러는 예상치 못한 결과를 야기 무엇인가가 좋아하는 순서에 st.pop()와 같은 하위 표현식을 평가할 수 있습니다.

2

이 당신의 코드를 수정,이 평가 문제의 순서 아닌 연관성 문제가 얼마나 확인하려면 원하는 경우가 괜찮아요, 당신은 닐의 답변을 받아 들일 수 ...
관련 문제