"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > C++에서 지도 요소에 할당하면 예기치 않은 크기가 발생하는 이유는 무엇입니까?

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

2024-11-04에 게시됨
검색:329

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

C에서 할당 문의 평가 순서

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

map mp;
printf("%d ", mp.size());
mp[10] = mp.size();
printf("%d\n", mp[10]);

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

0 1

이 결과는 직관에 어긋나는 것처럼 보일 수 있습니다. 할당 후 맵 크기는 1이 됩니다. 그러나 할당 문의 평가 순서는 여기서 중요한 역할을 합니다.

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

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

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

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

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

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

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3