> 백엔드 개발 > C++ > `i = i`는 C에서 사용자 정의 유형으로 정의되지 않은 동작을 호출합니까?

`i = i`는 C에서 사용자 정의 유형으로 정의되지 않은 동작을 호출합니까?

Mary-Kate Olsen
풀어 주다: 2024-12-05 10:36:15
원래의
783명이 탐색했습니다.

Does `i  =   i` Invoke Undefined Behavior with User-Defined Types in C  ?

재검토된 정의되지 않은 동작: 시퀀스 포인트 및 사용자 정의 유형

질문:

정의되지 않은 동작 및 시퀀스 포인트에 대한 이전 기사에서 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿