> 백엔드 개발 > C++ > C에서 맵 값을 할당하면 예기치 않은 결과가 발생하는 이유는 무엇입니까?

C에서 맵 값을 할당하면 예기치 않은 결과가 발생하는 이유는 무엇입니까?

DDD
풀어 주다: 2024-10-28 15:10:02
원래의
603명이 탐색했습니다.

 Why Does Assigning a Map Value in C   Produce Unexpected Results?

C 할당 문의 평가 순서

C에서 맵에 값을 할당할 때 평가 순서가 직관에 반하는 결과를 초래할 수 있습니다. 다음 코드를 고려해보세요:

map<int, int> mp;<br>printf("%d ", mp.size());<br>mp[10]=mp.size();<br>printf("%dn", mp[10]);<br>

이 코드는 0과 1을 인쇄하지만 0과 0이 나올 것으로 예상할 수도 있습니다. 그 이유는 다음과 같습니다.

  1. 오른쪽에서 왼쪽으로 평가: C의 할당 연산자는 오른쪽에서 왼쪽으로 연결됩니다. 즉, mp[10]은 mp.size()보다 먼저 평가됩니다.
  2. 임시 참조: 왼쪽 mp[10] 할당의 기본 맵 요소에 대한 임시 참조를 생성합니다. 이 요소는 처음에 초기화되지 않았으므로 mp.size()는 처음에 0을 반환합니다.
  3. 값 수정: mp[10]=mp.size() 할당은 mp[10의 값을 설정합니다. ]를 맵의 현재 크기(0)로 바꿉니다.
  4. 참조 수명 연장: 할당은 mp[10]에 의해 생성된 임시 참조의 수명을 일시적으로 연장합니다.
  5. 최종 평가: mp[10]는 이제 수정된 요소를 가리키므로 printf("%d", mp[10]); 1의 업데이트된 값을 인쇄합니다.

지정되지 않은 동작

이 특정 동작은 C 표준에서 지정되지 않습니다. 그러나 최근 제안(N4228)에서는 이러한 경우 평가 순서를 명확히 하려고 합니다.

수정된 제안의 [expr.ass]p1 섹션에는 다음과 같이 명시되어 있습니다.

"올바른 피연산자는 다음과 같습니다. 왼쪽 피연산자 앞에 시퀀스가 ​​지정됩니다."

이는 위의 예에서 mp.size()가 mp[10]보다 먼저 평가되어 예상 출력이 0과 0이 된다는 의미입니다.

업데이트

C 17에서 이 동작은 제안 p0145의 개정 3에 따라 표준에 지정되었다는 점에 유의하는 것이 중요합니다. 이제 오른쪽 피연산자는 대입문에서 왼쪽 피연산자 앞에 명시적으로 순서가 지정됩니다.

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

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