>백엔드 개발 >C++ >C에서 지도 요소에 할당하면 예기치 않은 크기가 발생하는 이유는 무엇입니까?

C에서 지도 요소에 할당하면 예기치 않은 크기가 발생하는 이유는 무엇입니까?

DDD
DDD원래의
2024-11-01 08:36:02289검색

 Why Does Assigning to a Map Element in C   Result in an Unexpected Size?

C에서 할당 문의 평가 순서

맵에 값을 할당할 때 수수께끼 같은 출력을 얻을 수 있습니다.

<code class="cpp">map<int, int> mp;
printf("%d ", mp.size());
mp[10] = mp.size();
printf("%d\n", mp[10]);</code>

이 코드는 다음을 인쇄합니다.

0 1

이 결과는 할당 후 지도 크기가 1이 될 것으로 예상할 수 있으므로 직관에 반하는 것처럼 보일 수 있습니다. 그러나 할당 문의 평가 순서는 여기서 중요한 역할을 합니다.

할당 mp[10]의 왼쪽은 맵 요소의 기본 값에 대한 참조를 반환합니다. 동시에 이 작업은 mp[10] 요소에 대한 새 값을 생성합니다. 이 작업 후에만 새로 계산된 맵 크기를 사용하여 오른쪽이 평가됩니다.

이 동작은 C 표준에 명시적으로 명시되어 있지 않지만 지정되지 않은 동작에 해당합니다. 최근 제안인 N4228은 그러한 사례를 지정하기 위해 평가 규칙의 순서를 개선하는 것을 목표로 합니다.

초안 C 11 표준(1.9)의 관련 섹션에서는 개별 표현식의 하위 표현식 평가가 일반적으로 순서가 없다고 명시합니다. 그러나 함수 호출(예: 연산자 [] 및 size())은 호출된 함수 본문이 실행되기 전에 순서가 지정됩니다.

따라서 대입 표현식의 오른쪽 피연산자는 왼쪽 피연산자 다음에 순서가 지정되므로 결과는 다음과 같습니다. 관찰된 행동. 즉, 평가 순서는 다음과 같습니다.

  1. 오른쪽 피연산자 평가: mp.size()
  2. 왼쪽 피연산자의 값 생성: mp[10]
  3. 오른쪽 피연산자의 값을 왼쪽 피연산자에 할당

C 표준 업데이트에서는 이 동작을 지정하여 할당 표현식의 오른쪽 피연산자가 순서대로 지정됨을 명확히 할 것으로 예상됩니다. 왼쪽 피연산자 앞에

위 내용은 C에서 지도 요소에 할당하면 예기치 않은 크기가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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