정의되지 않은 동작 및 시퀀스 포인트: 심층 분석
표현식 i = i; 정의되지 않은 동작(UB)을 호출하는 것으로 레이블이 지정되었지만 제공된 Index 클래스에서와 같이 i의 유형이 사용자 정의인 경우 어떻게 될까요?
사용자 정의 유형 및 UB
Index와 같은 사용자 정의 유형의 경우 i = i; 여전히 UB로 간주됩니다. 이는 사용자 정의 유형이 증분 연산자의 기본 동작을 재정의하지 않기 때문입니다. 연산자 () 및 연산자 =() 함수는 Index 개체의 내부 상태만 수정하고 시퀀스 포인트를 생성하지 않습니다. 따라서 표현식은 연속된 시퀀스 포인트 사이에서 객체를 두 번 수정하여 UB가 됩니다.
표현식의 동등성
표현식 i.operator =(i.operator () ); 그리고 i.add(i.inc()); 원래 i = i;와 동일하지 않습니다. 첫 번째 표현식에서 i.operator() 평가 후 시퀀스 포인트를 사용하면 = 연산자 평가 전에 Index 개체를 수정할 수 있습니다. 마찬가지로 두 번째 식에서 멤버 함수 add 및 inc는 연속 시퀀스 지점 사이의 개체를 수정하지 않습니다. 따라서 이러한 표현식은 UB를 호출하지 않습니다.
표현식 정의 및 시퀀스 포인트
표현식 i = i; 실제로 표현식이지만 해당 동작이 잘 정의되어 있지 않습니다. 표현식과 연관된 시퀀스 포인트의 수는 관련된 피연산자의 유형에 의존하지 않습니다.
배열 첨자(a[ i] = i)
표현식 a [ 나는 ] = 나는; a가 내장 유형의 배열이거나 a가 아래 첨자 연산자를 오버로드하는 사용자 정의 유형인 경우 두 경우 모두 UB입니다. 두 경우 모두 [ i] 표현식이 먼저 평가되며, 이는 i를 증가시키고 사전 증가된 값을 반환합니다. 그런 다음 이 값은 배열에 대한 인덱스로 사용되며, 인덱스가 범위를 벗어나면 UB가 발생할 수 있습니다.
다중 증분 연산( i)
표현 나; C 03에서 잘 정의되어 있으며 ((((i.operator ()).operator ()).operator ()).operator ()).operator ()); 표현식과 동일한 동작을 갖습니다. 각 연산자() 호출은 Index 개체에 대한 참조를 반환하며, 각 함수 평가 후 시퀀스 포인트는 개체가 연속 시퀀스 포인트 사이에서 한 번만 수정되도록 보장합니다.
결론
요약하면, i = i; 그리고 a[ i] = i; 유형이 오버로드된 연산자를 제공하는 경우에도 사용자 정의 유형에 대해 UB를 호출합니다. Index 객체에 대한 다중 증분 연산은 잘 정의되어 있으며 시퀀스 지점과 시퀀스 지점 사이의 객체 수정 횟수가 관련된 피연산자 유형과 무관하다는 것을 보여줍니다.
위 내용은 사용자 정의 유형에서도 `i = i;`가 정의되지 않은 동작입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!