¿Quién define la precedencia del operador C y la asociatividad?
En cada libro de texto en C / C ++, encontrará una tabla de precedencia y asociación de operadores, como la siguiente:
http://en.cppreference.com/w/cpp/language/operator_precedence
Una de las preguntas en StackOverflow hizo algo como esto:
¿Qué orden ejecutan las siguientes funciones?
f1() * f2() + f3();
f1() + f2() * f3();
Refiriéndome al gráfico anterior, respondí con confianza que las funciones tienen asociatividad de izquierda a derecha, por lo que en las declaraciones anteriores se evalúan de esta manera en ambos casos:
f1 () -> f2 () -> f3 ()
Después de evaluar las funciones, finaliza la evaluación de esta manera:
(a1 * a2) + a3
a1 + (a2 * a3)
Para mi sorpresa, muchas personas me dijeron que estaba totalmente equivocado. Decidido a probar que estaban equivocados, decidí recurrir al estándar ANSI C11. Me sorprendió una vez más descubrir que se menciona muy poco sobre la precedencia y la asociatividad del operador.
PreguntasSi mi creencia de que las funciones siempre se evalúan de izquierda a derecha es incorrecta, ¿qué significa realmente la tabla que se refiere a la precedencia y asociatividad de la función?¿Quién define la precedencia y la asociatividad del operador si no es ANSI? Si es ANSI quien hace la definición, ¿por qué se menciona poco sobre la precedencia y la asociatividad del operador? ¿Se deducen la precedencia y la asociatividad del operador del estándar ANSI C o se define en Matemáticas?