2011-01-24 4 views
0

세미콜론 앞에 시퀀스 포인트가 없다는 것을 알고 있지만, 역 참조 포인터가 표현식에서 이전 값 2를 사용하는 것에 대한 그럴듯한 설명이 있습니까?+ = 연산자 연쇄 (UB 대시로)

또는 단순히 정의되지 않은 동작으로 표시 할 수 있습니까?

int i=2; 
int *x=&i; 
*x+=*x+=i+=7; 

결과 :

i= 13 

답변

7

그것은이다 "단순히"정의되지 않은 동작.

즉, 컴파일러는 i의 값을 읽은 다음 모든 산술 연산을 수행 한 다음 새로운 값인 i을 저장하는 코드를 내 보낸 것으로 보입니다.

실제 설명을 찾는 확실한 방법은 컴파일러에서 생성 된 어셈블리를 살펴 보는 것입니다.

-3

동작이 정의되지 않은 경우 컴파일러가 식을 분해하고 중간 결과를 스택에 푸시하는 방식입니다. 두 개의 숫자가 먼저 계산되고 (둘 다 같음) 스택에 푸시됩니다. 그런 다음 i에 7이 추가되고 9가됩니다. 그런 다음 두 번째와 동일한 두 번째 *x이 스택에서 제거되어 11이됩니다. 그런 다음 첫 번째 *x이 스택에서 제거되고 11에 추가됩니다. 13.

여기에서 일어나고있는 일에 대한 힌트를 찾으려면 역방향 폴란드어 표기법을 찾으십시오.

+0

+1 훨씬 더 나은 설명 : – badgerr

+1

가장 명확하게 정의되지 않은 동작이며 스택과 관련이 없습니다. –

+1

AFAIK, 일부 표현식이 일부 변수를 두 번 이상 변경하면 UB가됩니다. x가 i를 가리 키지 않았다면 그것은 다른 이야기 일 것입니다. 아마도. –

관련 문제