정의되지 않은 동작 및 시퀀스 포인트 재검토
"정의되지 않은 동작 및 시퀀스 포인트" 주제의 후속편에서는 사용자 정의가 포함된 표현식 유형.
사용자 정의 유형 및 정의되지 않은 동작
사용자 정의 유형 인덱스와 관련된 다음 표현식을 고려하십시오.
i += ++i;
동작 내장 유형이 포함된 이 표현식은 정의되지 않았습니다. 그러나 i가 Index 유형인 경우에도 정의되지 않은 동작을 호출합니까?
아니요, 그렇지 않습니다. 이는 표현식이 다음과 동일해지기 때문입니다.
i.operator+=(i.operator++());
오버로드된 연산자는 함수이므로 일반적인 순서 규칙이 적용됩니다. i.operator() 평가 후에 시퀀스 포인트가 존재하므로 i.operator =()에서 i의 후속 수정은 정의되지 않은 동작 규칙을 위반하지 않습니다.
마찬가지로 i.add(i 표현식도 마찬가지입니다. .inc()); 그리고 나는 잘 정의되어 있습니다. 첫 번째 표현식은 다음과 같습니다.
i.operator+=(i.operator++());
두 번째 표현식은 다음과 같습니다.
(i.operator++()).operator++()).operator++();
이러한 각 표현식에는 연산자 () 표현식 평가 후 시퀀스 포인트가 있습니다. , 연속된 시퀀스 포인트 사이에서 객체 i가 두 번 수정되지 않도록 합니다.
하위 첨자 연산자 오버로드
a[++i] = i;
여기서 a는 첨자 연산자를 오버로드하는 사용자 정의 유형이며 잘 정의되어 있습니다. 증분 연산자는 Index 객체를 반환하며, 이 객체는 배열을 인덱싱하는 데 사용됩니다. 할당 연산자 =는 함수 호출인 Operator[]() 메서드와 동일합니다. 따라서 순서 규칙이 적용되고 i를 평가한 후에 순서 점이 존재합니다. 결과적으로 표현식은 잘 정의되어 있습니다.
추가 지점
위 내용은 C의 연산자 오버로딩은 `i = i`와 같은 표현식에서 정의되지 않은 동작을 제거합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!