2011-05-16 5 views
10

나는 this 주제를 읽은 후에도 약간 혼란 스럽다. 다음 C++ 표현식 *d++ = ~(*d);이 잘 정의되어 있습니까? 그렇습니다. 이처럼 복잡한 표현은 추한 것입니다. 나는 쓰지 않았습니다.잘 정의 된 코드입니까?

*d = ~(*d); 
d++; 

조립 :

*d++ = ~(*d); 
0x83384 LDR   R3,[R0 <d>,4]  <<diff 
0x83388 ADD   R1 <c>, R1 <c>, 1 
0x8338c MVN   R3, R3 
0x83390 STR   R3,[R0 <d>],4 

감사

*d = ~(*d); 
d++; 
0x83384 LDR   R3,[R0 <d>] 
0x83388 ADD   R1 <c>, R1 <c>, 1 
0x8338c MVN   R3, R3 
0x83390 STR   R3,[R0 <d>],4 

대 내가 그것을 비교할 때

내가 생성 된 어셈블리의 약간의 차이를 볼!

+0

모든 특정 어셈블러가이 특정 컴파일러의 특정 버전이이 특정 시간에 사용한 설정으로 무엇인지 알려주려고합니다. 그것은 표준에 의해 보장되는지 아닌지를 말하지 않습니다. –

+0

감사합니다. 처음에는 컴파일러가이 질문의 컨텍스트에서 생성 된 내용을 확인하는 것이 도움이 될 것이라고 생각했습니다. 나는 정의되지 않은 경우에 잠재적으로 생성 된 것을 볼 수있다. – Mav3rick

답변

9
*d++ = ~(*d); 

이 표현식에서 어떤 객체도 새로운 값을 한 번 더 저장하지 않습니다. d + 1의 값은 증분 연산자 (d++)의 부작용으로 d에 저장되고이 증분이 할당 연산자에 의해 쓰여지기 전에 d이 가리키는 개체 값이 지정됩니다.

문제는 d이 판독 된 값을 결정 단순히 다시에 기록되는 (즉 d + 1)은 물론 오른쪽 서브 표현식 ~(*d)에서 읽을 수있는 주소를 결정하기 위해 판독되는 것으로한다.

이 ISO/IEC의 세 번째 문장 14,882 위반 2003 5 EXPR/4 (간결함을 위해 생략 첫 번째 문장)

[...] 이전 및 다음 시퀀스 포인트 간의 스칼라 객체는 표현식의 평가에 의해 한 번만 수정 된 저장된 값을 가져야한다. 또한, 이전 값은 저장 될 값을 결정하기 위해서만 액세스되어야한다.이 단락의 요구 사항은 전체 표현식의 하위 표현식이 허용되는 순서대로 충족되어야합니다. 그렇지 않으면 동작이 정의되지 않습니다.

+0

이것은 매우 유용한 설명입니다. 고맙습니다. – Mav3rick

11

귀하의 표현이 정의되지 않은 (지정되지 않은 반대) 행동을 가지고있다. 어셈블리 코드는 베토벤을 9 번 연주 할 수 있으며 여전히 표준에 부합 할 수 있습니다. 성령 표준에서

, 제 5 장, 4 절 : 이전 및 다음 시퀀스 지점 사이

는 스칼라 객체의 저장 값은 표현의 평가에 의해에서 가장 번 수정 한 것이다.

따라서 코드는 부적절합니다. 나는 표준 준수 컴파일러가 이 필요한지 진단 할 수 없다는 것을 알지 못한다.하지만 나는 이걸로 충분히 배워야한다.

자세한 내용은 @Prasoon Saurav의 우수한 설명 there을 참조하십시오.

+0

나는 그것이 좋겠다고 생각한다. – Femaref

+0

* 그게 꽤 멋져! :) – FrustratedWithFormsDesigner

+0

@coward downvoter : 귀하의 의도를 명확히하십시오. 나는 OP에서 지적한 링크마다 UB라고 확신하지만 틀릴 수도 있습니다. –

1

++가 평가되는 시점을 알 수 없습니다. 나는 당신의 컴파일러 따라서

*d = ~(*(d+1)); 

당신의 dicrepancy 초래 ~(*d) 전에 평가 가정합니다.

+0

아무 것도하지 마십시오. C++ ISO 표준에 따라 코드가 잘못 작성되었다고 가정 할 것은 없습니다. –

+0

rhs 조회 전에 ++를 적용한다고 언급하는 경우 * d = ~ (* (d + 1))을 의미한다고 생각합니다. –

+0

@Alexander C., 나는 Christian이 분해 예제가 일부 특정 컴파일러가 먼저 증가했다는 것을 보여 주었다고 생각하고 있으며 이는 반대 순서의 어셈블리 (또는 기대)와는 다를 것이라고 생각합니다. –

관련 문제