2014-09-10 2 views
-2

첫째,이 방법은 연산자 우선 순위가 작동하고 내 프로젝트에서 나에게 사용되지 않는 방법을 이해하려는 시도입니다.이상한 연산자 우선 순위 및 역 참조

int *a=new int[3]; 
a[0]=3;a[1]=7;a[2]=11; 
*a*=++*a**a++; 
cout<<*(a-1)<<endl<<*a<<endl<<*(a+1); 

다음과 같은 출력,

4 
112 
11 

나는 다음과 같은 출력을 기대하고,

64 
7 
11 

누군가가 이런 일이 어떻게 말해 주시겠습니까를 제공? 고맙습니다.

+4

HTTP ://en.wikipedia.org/wiki/Sequence_point –

답변

3

운영자 우선 순위를 존중하여도 sequence points을 존중하지 않으므로 정의되지 않은 동작이 발생합니다. 모든 부작용, 순서 포인트라는 실행 순서에서 어떤 특정 지점에서

, http://www.parashift.com/c++-faq/sequence-points.html

은 C++의 표준 말한다 (1.9p7) :

여기 CPP 자주 묻는 질문에서보세요 이전의 평가가 완료되어야하고 이후 평가의 부작용이 발생하지 않아야한다.

예를 들어 표현식에 y ++ ++ 하위 표현식이 포함되어 있으면 변수 y가 다음 시퀀스 포인트만큼 증가합니다. 또한 시퀀스 포인트 바로 뒤에있는 표현식에 하위 표현식 ++ z가 포함되어 있으면 시퀀스 포인트에 도달 할 때까지 순간에 z가 아직 증가하지 않았습니다.

개인 사업자 및 개인의 표현의 하위 표현식, 부작용이 수행되는 순서의 피연산자의 평가의 순서, 지정되지

시퀀스 포인트

추가 정보 : https://stackoverflow.com/a/4176333/1938163

+0

감사합니다. 보너스 오류는 오류가 아니지만 * a ++는 a를 +1로 증분하므로 현재는 [1]을 가리키고 있으므로 모든 배열 값을 가져 오려면 * (a-1), * a, * (a + 1) –

+0

맞아, 편집 중이 야. 감사 –