Os pontos de sequência limitam a liberdade do compilador para reordenar operações arbitrariamente, mas as otimizações ainda podem reordená-las se o compilador concluir que isso não alterará os resultados. Assim, neste código:
há um ponto de sequência após cada instrução, então o código deve incrementar x
uma vez antes da atribuição a y
e outra vez depois. No entanto, o incremento de x
não afeta y
ou z
, e a definição de y
não pode afetar x
. Por isso, o código pode ser otimizado para:
Normalmente, isso não tem nenhum efeito além de tornar o programa mais rápido. Mas existem situações especiais em que isso pode causar problemas devido a coisas que o compilador não pode saber, como memória compartilhada. Para limitar a otimização nesses casos, use o qualificador de tipo volatile
(veja ).