정의되지 않은 동작 및 시퀀스 포인트 재검토
i = i 표현식은 i가 내장 유형일 때 정의되지 않은 동작을 호출하는 것으로 표시되었습니다. . 그러나 i가 사용자 정의 유형인 경우 유사한 표현식의 동작에 대한 의문이 제기됩니다.
사용자 정의 유형 고려 사항
Index 유형은 다음과 같이 정의됩니다.
class Index { int state; public: Index(int s) : state(s) {} Index& operator++() { state++; return *this; } Index& operator+=(const Index &index) { state += index.state; return *this; } operator int() { return state; } Index& add(const Index &index) { state += index.state; return *this; } Index& inc() { state++; return *this; } };
다음과 같은 표현식이 있을까요? i.operator =(i.operator ()); 또는 i.add(i.inc()); 아직도 정의되지 않은 동작을 호출합니까?
시퀀스 포인트 의미
표현식 i.operator =(i.operator ()); 다음과 같은 이유로 정의되지 않은 동작을 호출하지 않습니다.
비표현식 고려사항
원래 표현식 i = i는 과연 표현식인지에 대한 의문을 제기합니다. 그렇지 않은 경우 시퀀스 포인트 규칙이 적용되지 않을 수 있습니다. 그러나 이 인수는 표현식으로 구문 분석되고 실행되기 때문에 유지될 가능성이 없습니다.
다중 수정
관심 있는 다른 표현식, a[ i] = i , 또한 시퀀스 포인트 간의 잠재적인 수정으로 인해 질문이 제기됩니다. 그러나 a가 첨자 연산자를 오버로드하는 사용자 정의 유형인 경우에는 잘 정의됩니다.
표현 복잡도
C에서는 i 표현식이 잘 정의되어 있습니다. 03은 함수 사이에 잘 정의된 시퀀스 포인트를 갖는 ((i.operator ()).operator ()).operator ()와 동일하기 때문입니다.
결론
사용자 정의 유형 및 시퀀스 포인트와 관련된 표현식의 동작은 연산자의 특정 구현에 따라 다릅니다. 오버로드된 연산자는 함수처럼 동작하여 시퀀스 포인트를 제공합니다. 그러나 표현식에 시퀀스 포인트 규칙이 적용되는지 여부는 구문 구조와 표현식으로서의 해석에 따라 달라질 수 있습니다.
위 내용은 오버로딩 연산자는 사용자 정의 유형의 `i = i`와 같은 표현식에서 정의되지 않은 동작을 제거합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!