"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Por qué la asignación a un elemento de mapa en C++ da como resultado un tamaño inesperado?

¿Por qué la asignación a un elemento de mapa en C++ da como resultado un tamaño inesperado?

Publicado el 2024-11-04
Navegar:976

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

Orden de evaluación de las declaraciones de asignación en C

Se puede obtener un resultado desconcertante al asignar un valor a un mapa:

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

Este código imprime:

0 1

Este resultado puede parecer contradictorio, ya que uno podría esperar que El tamaño del mapa será 1 después de la asignación. Sin embargo, el orden de evaluación de la declaración de asignación juega un papel crucial aquí.

El lado izquierdo de la asignación mp[10] devuelve una referencia al valor subyacente del elemento del mapa. Simultáneamente, esta acción crea un nuevo valor para el elemento mp[10]. Sólo después de esta operación se evalúa el lado derecho, utilizando el tamaño recién calculado del mapa.

Este comportamiento no se establece explícitamente en el estándar C, pero se incluye en un comportamiento no especificado. Una propuesta reciente, N4228, tiene como objetivo refinar el orden de las reglas de evaluación para especificar tales casos.

La sección relevante del borrador del estándar C 11 (1.9) establece que las evaluaciones de subexpresiones de expresiones individuales generalmente no están secuenciadas. Sin embargo, las llamadas a funciones (como el operador [] y el tamaño()) se secuencian antes de la ejecución del cuerpo de la función llamada.

Por lo tanto, el operando derecho de la expresión de asignación se secuencia después del operando izquierdo, lo que da como resultado el comportamiento observado. Esto significa que el orden de evaluación es el siguiente:

  1. Evalúa el operando derecho: mp.size()
  2. Crea el valor para el operando izquierdo: mp[10]
  3. Asignar el valor del operando derecho al operando izquierdo

Se espera una actualización del estándar C para especificar este comportamiento, dejando claro que el operando derecho de una expresión de asignación está secuenciado antes del operando izquierdo.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3