Порядок оценки операторов присваивания в 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()) упорядочиваются до выполнения тела вызываемой функции.
Поэтому правый операнд выражения присваивания располагается после левого операнда, в результате чего наблюдаемое поведение. Это означает, что порядок вычисления следующий:
Ожидается, что обновление стандарта C укажет такое поведение, давая понять, что правый операнд выражения присваивания упорядочен перед левым операндом.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3