"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Por que a atribuição a um elemento do mapa em C++ resulta em um tamanho inesperado?

Por que a atribuição a um elemento do mapa em C++ resulta em um tamanho inesperado?

Publicado em 2024-11-04
Navegar:240

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

Ordem de avaliação das instruções de atribuição em C

Uma saída intrigante pode ser obtida ao atribuir um valor a um mapa:

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

Este código imprime:

0 1

Este resultado pode parecer contra-intuitivo, como se poderia esperar que o o tamanho do mapa será 1 após a atribuição. No entanto, a ordem de avaliação da instrução de atribuição desempenha um papel crucial aqui.

O lado esquerdo da atribuição mp[10] retorna uma referência ao valor subjacente do elemento do mapa. Simultaneamente, esta ação cria um novo valor para o elemento mp[10]. Somente após esta operação o lado direito é avaliado, usando o tamanho recém-calculado do mapa.

Este comportamento não é explicitamente declarado no padrão C, mas se enquadra no comportamento não especificado. Uma proposta recente, N4228, visa refinar a ordem das regras de avaliação para especificar tais casos.

A seção relevante do projeto da norma C 11 (1.9) afirma que as avaliações de subexpressões de expressões individuais geralmente não são sequenciadas. No entanto, chamadas de função (como operador [] e size()) são sequenciadas antes da execução do corpo da função chamada.

Portanto, o operando direito da expressão de atribuição é sequenciado após o operando esquerdo, resultando em o comportamento observado. Isso significa que a ordem de avaliação é a seguinte:

  1. Avalie o operando direito: mp.size()
  2. Crie o valor para o operando esquerdo: mp[10]
  3. Atribuir o valor do operando direito ao operando esquerdo

Espera-se que uma atualização no padrão C especifique esse comportamento, deixando claro que o operando direito de uma expressão de atribuição é sequenciado antes do operando esquerdo.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3