Quem define a precedência e a associatividade do operador C?
Em todos os livros didáticos sobre C / C ++, você encontrará uma tabela de precedência e associatividade do operador, como a seguir:
http://en.cppreference.com/w/cpp/language/operator_precedence
Uma das perguntas no StackOverflow perguntou algo como isto:
Em que ordem as seguintes funções são executadas:
f1() * f2() + f3();
f1() + f2() * f3();
Referindo-me ao gráfico anterior, respondi com confiança que as funções têm associatividade da esquerda para a direita, portanto, nas declarações anteriores, elas são avaliadas dessa maneira nos dois casos:
f1 () -> f2 () -> f3 ()
Após as funções serem avaliadas, você termina a avaliação da seguinte maneira:
(a1 * a2) + a3
a1 + (a2 * a3)
Para minha surpresa, muitas pessoas me disseram que eu estava completamente errado. Determinado a provar que estavam errados, decidi recorrer ao padrão ANSI C11. Mais uma vez fiquei surpreso ao descobrir que muito pouco é mencionado sobre precedência e associatividade do operador.
QuestõesSe minha opinião de que as funções são sempre avaliadas da esquerda para a direita está errada, o que a tabela referente à precedência e associatividade da função realmente significa?Quem define precedência e associatividade do operador se não for ANSI? Se é o ANSI quem faz a definição, por que é pouco mencionado sobre precedência e associatividade do operador? A precedência e a associatividade do operador são inferidas a partir do padrão ANSI C ou estão definidas em Matemática?