3

실행 :(런타임 실행 우선 순위를?)이 간단한 코드의

a=0x939f008, *a=1 
0 0x939f008 *ptr=0 
a=0x939f008, *a=1 
0 0x939f008 *ptr=1 

설명해주십시오 왜 * PTR =

int foo(int* a){ 
    cout <<"a="<<a; 
    *a=1; 
    cout <<", *a="<<*a<<endl; 
    return 0;} 

int main() { 
    int* ptr; 
    ptr=new int[2]; 
    ptr[0]=0; 
    ptr[1]=0; 

    cout<< foo(ptr) <<" "<< ptr <<" *ptr="<< *ptr <<endl; 
    cout<< foo(ptr) <<" "<< ptr <<" *ptr="<< *ptr <<endl; 

    return 0;} 

는 (리눅스)에 리드 두 번째 줄에는 0이 있지만 네 번째 줄에는 없습니다. "물건"이 오른쪽에서 왼쪽으로 cout으로 "가져 오게"될 수 있습니까? 실제로 - 어떻게 실제로 작동합니까 (런타임에 단계별로)?

+0

시도해보기 : 1) 인쇄하기 전에'foo'를 호출하면 어떻게됩니까? 2)'* ptr' 다음에'foo (ptr)'가 먼저 나오면 어떻게 될까요? 3)'a [0]'과'a [1]'을 원본'cout' 다음에 출력하면 어떻게됩니까? – Dennis

+0

@Dennis (1) * ptr이 변경되어 이후의 cout에 "1"이 인쇄됩니다. (2) 흥미 롭습니다. cout << * ptr << "II"<< foo (ptr) << ""<

답변

5

함수에 대한 인수 평가 순서는 이며 C++ 표준에 따라 지정되지 않음입니다.
이있을 수 있습니다 : 왼쪽에서 오른쪽으로

  • 또는 오른쪽에서 왼쪽으로
  • 또는
  • 다른 순서를
  • 내 이전 대답 here

하나, 깊이와 세부 사항이 설명 .

+1

또한 cout 호출에서 호출 된 함수에서 cout 호출을 권장하지 않습니다. 그것은 끔찍한 좌절감을주는 디버깅 경험을합니다. –

+0

모두 나쁘지는 않습니다. C++ _does_는 함수가 호출되기 전에 함수에 대한 모든 인수가 평가된다는 것을 보증합니다. 모든'<< "는 독립적 인 함수 호출이므로'cout' 인쇄가 왼쪽에서 오른쪽으로 작동하는 것이 보장되는 이유입니다. – MSalters

+0

@Msalters ** 인쇄 **는 왼쪽에서 오른쪽으로 보장되지만 인수의 ** 평가 **는 보장되지 않습니다. [Here] (http://ideone.com/H0g3E)는 몇 가지 증거입니다. 여러분이 아시다시피,'std :: cout << foo() << bar()'표현식은'operator << (연산자 << (std :: cout, foo()), bar)'구현하고,'foo()'와'bar()'인수를 자유롭게 평가할 수 있습니다. – fredoverflow