Quem define a precedência e a associatividade do operador C?

Introdução

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?

questionAnswers(5)

yourAnswerToTheQuestion