«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему присвоение элементу карты в C++ приводит к неожиданному размеру?

Почему присвоение элементу карты в C++ приводит к неожиданному размеру?

Опубликовано 4 ноября 2024 г.
Просматривать:410

 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