기술적으로 전반적으로 이것은 Undefined Behavior 입니다.
그러나 대답에는 두 가지 중요한 측면이 있습니다.
코드 설명 :
std::cout << a++ << a;
다음과 같이 평가됩니다.
std::operator<<(std::operator<<(std::cout, a++), a);
표준은 함수에 대한 인수 평가 순서를 정의하지 않습니다.
따라서 다음 중 하나 :
std::operator<<(std::cout, a++)
먼저 평가되거나
a
먼저 평가되거나
- 구현 정의 순서 일 수 있습니다.
이 순서는 표준에 따라 미지정 [Ref 1] 입니다.
[참고 1] C ++ 03 5.2.2 함수 호출
8 항
인수 평가 순서는 지정되지 않습니다 . 인수 표현식 평가의 모든 부작용은 함수가 입력되기 전에 적용됩니다. 접미사 식 및 인수 식 목록의 평가 순서는 지정되지 않습니다.
또한 함수에 대한 인수 평가 사이에는 시퀀스 포인트가 없지만 모든 인수를 평가 한 후에 만 시퀀스 포인트가 존재합니다 [Ref 2] .
[참고 2] C ++ 03 1.9 프로그램 실행 [intro.execution] :
17 항 :
함수를 호출 할 때 (함수가 인라인인지 여부에 관계없이) 모든 함수 인수 (있는 경우)를 평가 한 후 함수 본문의 표현식 또는 명령문을 실행하기 전에 발생하는 시퀀스 지점이 있습니다.
여기에서의 값은 c
중간 시퀀스 지점없이 두 번 이상 액세스되고 있으며 이에 대해 표준은 다음과 같이 말합니다.
[참고 3] C ++ 03 5 표현식 [expr] :
4 항 :
....
이전 시퀀스 포인트와 다음 시퀀스 포인트 사이에서 스칼라 객체는 표현식 평가에 의해 최대 한 번 수정 된 저장된 값을 가져야합니다. 또한 이전 값은 저장할 값을 결정하기 위해서만 액세스해야합니다 . 이 단락의 요구 사항은 전체 표현의 하위 표현의 허용 가능한 각 순서에 대해 충족되어야합니다. 그렇지 않으면 동작이 정의되지 않습니다 .
코드는 c
시퀀스 포인트를 간섭하지 않고 두 번 이상 수정 하며 저장된 객체의 값을 결정하기 위해 액세스하지 않습니다. 이는 위의 조항에 대한 명백한 위반이므로 표준에서 요구하는 결과는 Undefined Behavior [Ref 3] 입니다.