> 백엔드 개발 > C++ > `i = i`는 C에서 항상 정의되지 않은 동작입니까?

`i = i`는 C에서 항상 정의되지 않은 동작입니까?

Patricia Arquette
풀어 주다: 2024-12-07 03:00:11
원래의
886명이 탐색했습니다.

Is `i  =   i` Always Undefined Behavior in C  ?

재검토된 정의되지 않은 동작 및 시퀀스 포인트

내장 유형에 대한 정의되지 않은 동작

이전 기사에서 "정의되지 않은 동작 및 시퀀스 포인트," 우리는 표현식:

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] = i 표현식은 a가 오버로드된 첨자 연산자가 있는 사용자 정의 유형인 경우에도 잘 정의됩니다. 이는 i 표현식을 평가한 후 시퀀스 포인트가 있는 함수 호출로 간주되기 때문입니다. .

i에 대한 잘 정의된 동작

C 03에서 i 표현식은 효과적으로 동일하므로 잘 정의되어 있습니다. to:

((i.operator++()).operator++()).operator++();
로그인 후 복사

각 함수 호출을 통해 시퀀스 포인트가 도입되어 표현식이 잘 정의됩니다.

위 내용은 `i = i`는 C에서 항상 정의되지 않은 동작입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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