이전 기사에서 "정의되지 않은 동작 및 시퀀스 포인트," 우리는 표현식:
i += ++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 = i 표현식이 여전히 정의되지 않은 동작을 호출합니까?
놀랍게도 그렇지 않습니다. 사용자 정의 유형 i가 있는 식 i = i는 정의되지 않은 동작을 호출하지 않습니다. 왜냐하면 오버로드된 연산자는 C에서 함수로 간주되기 때문입니다. C ISO 표준의 섹션 1.9.17에 따르면:
함수를 호출할 때(함수가 인라인인지 여부에 관계없이) 모든 함수 인수를 평가한 후에 시퀀스 포인트가 있습니다...
따라서 연산자 및 연산자 = 함수에 대한 호출은 시퀀스 포인트를 도입하여 정의되지 않은 동작을 방지합니다.
a[ i] = i 표현식은 a가 오버로드된 첨자 연산자가 있는 사용자 정의 유형인 경우에도 잘 정의됩니다. 이는 i 표현식을 평가한 후 시퀀스 포인트가 있는 함수 호출로 간주되기 때문입니다. .
C 03에서 i 표현식은 효과적으로 동일하므로 잘 정의되어 있습니다. to:
((i.operator++()).operator++()).operator++();
각 함수 호출을 통해 시퀀스 포인트가 도입되어 표현식이 잘 정의됩니다.
위 내용은 `i = i`는 C에서 항상 정의되지 않은 동작입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!