많은 사람들이 Null 포인터를 사용하여 정적 클래스 멤버에 액세스해도 런타임이 발생하지 않는다는 사실이 직관에 어긋난다고 생각할 수 있습니다. 오류. 이 기사에서는 이 동작을 설명하기 위해 기술적인 세부 사항을 자세히 살펴보고 잠재적인 함정에 대해 논의합니다.
논의의 핵심은 널 포인터 역참조 평가입니다. 초기화되지 않은 포인터를 통해 클래스 멤버에 액세스하는 것은 일반적으로 정의되지 않지만 정적 멤버는 예외입니다. 정적 멤버에 액세스할 때 개체 식(예: d->a)은 기본적으로 (*d).a와 동일합니다.
이 경우 정적 멤버 함수 fun에 대한 인수는 d이며 평가되지만 삭제됩니다. 이는 *d 연산이 폐기된 값 표현식이기 때문입니다. 즉, 부작용에 대해서만 평가된다는 의미입니다(이 경우 없음).
문제의 핵심 널 포인터를 통한 간접 참조가 본질적으로 정의되지 않은 동작을 초래하는지 여부를 중심으로 진행됩니다. C 표준은 이 문제에 대해 다소 상충되는 지침을 제공합니다. 그러나 더 이상의 lvalue-rvalue 변환이나 다른 작업 없이 null 포인터를 통한 단순한 간접 참조는 정의되지 않은 동작을 호출하지 않는다는 것이 널리 받아들여지는 해석입니다.
CWG 문제 #232의 맥락에서 널 포인터 역참조 문제를 해결하기 위해 "빈 lvalue" 개념이 제안되었습니다. 그러나 채택된 적은 없습니다.
예제 코드가 오류 없이 실행되도록 허용하는 근거는 null 포인터를 사용하여 정적 멤버 함수를 호출하는 데 ID가 필요하지 않다는 것입니다. 또는 객체의 저장된 값. 추가 lvalue 작업 없이 정적 멤버의 값에 간단히 액세스합니다.
널 포인터를 사용하여 정적 멤버에 액세스하는 것은 일반적으로 허용되지만 . 비정적 멤버에 액세스하는 연산자입니다. 비정적 멤버 액세스에는 개체가 유효해야 하며, 이로 인해 null 포인터를 사용할 때 정의되지 않은 동작이 발생할 수 있습니다.
위 내용은 Null 포인터를 사용하여 정적 클래스 멤버에 액세스하는 것이 작동하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!