재검토된 정의되지 않은 동작: 시퀀스 포인트 및 사용자 정의 유형
질문:
정의되지 않은 동작 및 시퀀스 포인트에 대한 이전 기사에서 i = i 표현식 내장 유형에 대해 정의되지 않은 동작을 호출하는 것으로 간주되었습니다. 그러나 질문이 생깁니다. i 유형이 사용자 정의라면 어떻게 될까요? 구체적으로, 오버로드된 연산자가 포함된 클래스 Index가 있다고 가정해 보겠습니다.
답변: 정의되지 않은 동작과 잘 정의된 동작
직관과는 달리 표현식 i = i는 Index와 같은 사용자 정의 유형에 대해 정의되지 않은 동작을 호출하지 않습니다. 이는 Index의 오버로드된 연산자가 함수로 간주되기 때문입니다. C ISO 표준에 따르면 함수 평가에서는 함수 인수 평가 후 시퀀스 포인트를 도입하고, 반환된 값을 복사한 후 또 다른 시퀀스 포인트를 도입합니다.
시퀀스 포인트 및 오버로드된 연산자
i = i의 경우 i 표현식은 연산자 =에 인수로 전달되기 전에 평가됩니다. 이는 i 평가 후에 시퀀스 포인트가 있다는 것을 의미하며, 객체 i가 연속 시퀀스 포인트 사이에서 한 번만 수정되도록 보장합니다.
따라서 Index와 같은 사용자 정의 유형에 대한 표현식 i = i는 동일합니다. 정의되지 않은 동작이 없는 잘 정의된 표현식인 i.operator =(i.operator ());를 작성하는 것입니다. 구문적으로 더 간단한 표현식 i.add(i.inc());에도 동일하게 적용됩니다.
미묘한 구별:
i =라는 점에 유의하는 것이 중요합니다. i는 C 문법의 의미에서 표현이 아닙니다. 대신에 표현식과 명령문을 구문적으로 결합한 "명령문 표현식"입니다. 명령문 표현식은 일반 명령문으로 실행되지만 그 결과를 변수에 할당할 수도 있습니다.
a[ i] = i의 동작
a가 배열인 경우 내장 유형의 a[ i] = i 표현식은 lvalue a[ i]가 두 번 평가되기 때문에 정의되지 않은 동작을 호출합니다. 즉, 표현식 i에서 한 번, 할당 i =에서 다시 한 번 평가됩니다. i.
그러나 a가 첨자 연산자를 오버로드하는 사용자 정의 유형인 경우 첨자 연산자의 구현에 따라 표현식이 다르게 동작할 수 있습니다. 예를 들어, const Index& 연산자[](Index i)를 사용하여 첨자 연산자를 구현하는 경우 첨자 연산자가 호출되기 전에 lvalue a[ i]가 한 번만 평가되므로 식이 잘 정의됩니다.
나의 타당성;
나는 표현이다; ((i.operator ()).operator ()).operator ()와 동일하므로 C 03에서 잘 정의되어 있습니다. 이는 각 연산자가 시퀀스 포인트를 도입하여 객체 i가 연속 시퀀스 포인트 사이에서 한 번만 수정되도록 하기 때문입니다.
위 내용은 `i = i`는 C에서 사용자 정의 유형으로 정의되지 않은 동작을 호출합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!