>백엔드 개발 >C++ >C의 연산자 오버로딩은 `i = i`와 같은 표현식에서 정의되지 않은 동작을 제거합니까?

C의 연산자 오버로딩은 `i = i`와 같은 표현식에서 정의되지 않은 동작을 제거합니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-04 00:22:09712검색

Does Overloading Operators in C   Eliminate Undefined Behavior in Expressions like `i  =   i`?

정의되지 않은 동작 및 시퀀스 포인트 재검토

"정의되지 않은 동작 및 시퀀스 포인트" 주제의 후속편에서는 사용자 정의가 포함된 표현식 유형.

사용자 정의 유형 및 정의되지 않은 동작

사용자 정의 유형 인덱스와 관련된 다음 표현식을 고려하십시오.

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를 평가한 후에 순서 점이 존재합니다. 결과적으로 표현식은 잘 정의되어 있습니다.

추가 지점

  • 표현식과 관련된 시퀀스 지점의 수는 관련된 피연산자의 유형에 따라 다릅니다. i=i의 경우가 보여주듯이
  • C03에서 i라는 표현은 잘 정의되어 있습니다.

위 내용은 C의 연산자 오버로딩은 `i = i`와 같은 표현식에서 정의되지 않은 동작을 제거합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.