>  기사  >  백엔드 개발  >  non-const 포인터가 실제 값의 수정을 허용하더라도 수정된 상수 변수가 컴파일 타임에 원래 값을 유지하는 이유는 무엇입니까?

non-const 포인터가 실제 값의 수정을 허용하더라도 수정된 상수 변수가 컴파일 타임에 원래 값을 유지하는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-01 19:33:02469검색

Why does a modified constant variable retain its original value at compile time, even though a non-const pointer allows for modification of its actual value?

비상수 포인터를 통한 상수 수정

주어진 코드에서 상수 변수 e는 2로 초기화됩니다. 그런 다음 const 포인터 w는 e의 주소를 가리키도록 캐스팅되어 변수의 const 특성을 암시적으로 제거합니다. w를 역참조하고 새 값을 할당하면 e 주소의 값이 2에서 5로 수정됩니다.

그러나 *w와 e의 값이 인쇄되면 다르게 나타납니다.

<code class="cpp">cout << *w << endl; // Outputs 5
cout << e << endl; // Outputs 2</code>

이 동작은 *w와 e가 평가되는 다양한 방식을 고려하여 설명할 수 있습니다.

  • *w는 런타임에 평가됩니다. 컴파일러는 *w가 const가 아닌 포인터임을 인식하고 w가 가리키는 주소에서 값을 동적으로 검색합니다. 해당 주소의 값이 5로 수정되었으므로 *w는 5를 올바르게 출력합니다.
  • e는 컴파일 타임 상수로 처리됩니다. 컴파일러는 e가 상수 변수임을 인식합니다. 컴파일 타임에 그 값을 평가합니다. e의 값은 컴파일 타임에 수정되지 않았으므로 컴파일러는 이를 계속 2로 처리합니다.

따라서 값의 차이는 *w와 e의 고유한 평가 시간에서 발생합니다. e 주소의 값이 수정되었음에도 불구하고 상수 변수 자체는 컴파일 타임에 수정되지 않은 상태로 유지됩니다. 그러나 상수가 아닌 포인터 w는 자신이 가리키는 주소의 값을 수정할 수 있도록 허용하므로 결과적으로 *w에 대해 5가 출력됩니다.

위 내용은 non-const 포인터가 실제 값의 수정을 허용하더라도 수정된 상수 변수가 컴파일 타임에 원래 값을 유지하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.