>  기사  >  백엔드 개발  >  `mp[10] = mp.size()`가 `mp`가 비어 있어도 C에서 `1`을 출력하는 이유는 무엇입니까?

`mp[10] = mp.size()`가 `mp`가 비어 있어도 C에서 `1`을 출력하는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-10-30 20:57:30899검색

Why Does `mp[10] = mp.size()` Output `1` in C   Even If `mp` is Empty?

C 할당문의 평가 순서 난제

C에서 할당문의 평가 순서가 항상 직관적이지는 않습니다. 다음 코드를 고려해 보세요.

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

이 겉보기에는 간단해 보이는 코드는 놀랍게도 "0 1"을 출력하는데, 이는 예상한 것과 다를 수 있습니다.

이유를 이해하려면 다음 코드를 자세히 살펴봐야 합니다. C 평가 순서의 세부 사항. C 표준의 [expr.ass](https://en.cppreference.com/w/cpp/언어/operator_locationment)에 지정된 할당 문, '모든 그룹은 오른쪽에서 왼쪽으로'입니다. 이는 오른쪽 피연산자가 왼쪽 피연산자보다 먼저 평가됨을 의미합니다. 또한 C 표준에서는 할당 작업에서 "오른쪽 및 왼쪽 피연산자의 값 계산 후, 할당 표현식의 값 계산 전에 할당 순서가 지정됩니다."

우리 코드에서 왼쪽 피연산자는 mp[10]이며 이는 할당 연산 자체입니다. 오른쪽 피연산자는 mp.size()이며 맵이 처음에 비어 있으므로 0으로 평가됩니다. 따라서 코드는 mp[10]을 0에 효과적으로 할당합니다. 그러나 할당 작업은 mp[10]의 값을 계산하기 전에 순서대로 수행됩니다. 즉, 먼저 mp[10] 값이 수정되어 맵에 새 항목이 생성되고 0으로 설정됩니다. 그런 다음에만 mp[10] 값이 평가되어 값이 1인 새로 생성된 항목이 표시됩니다. .

이것은 C에서 예상치 못한 평가 순서를 보여주는 분명한 예입니다. 이러한 예상치 못한 상황을 방지하려면 표준 사양을 알고 작업이 실행되는 순서를 고려하는 것이 중요합니다. 순서가 중요하지 않거나 정의되지 않은 동작이 발생할 가능성이 있는 경우 명시적인 괄호를 사용하여 평가 순서를 제어할 수 있습니다.

위 내용은 `mp[10] = mp.size()`가 `mp`가 비어 있어도 C에서 `1`을 출력하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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