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:
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.
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