En el estándar C99, las expresiones permiten precedencia y asociatividad.Asociatividad C99 para operadores: ¿dónde se especifica?
La precedencia está documentada bastante bien, ya que el orden en el que aparecen los operadores en el documento es de reducción de precedencia, por lo que las llamadas a funciones preceden a operadores multiplicativos que, a su vez, preceden a operadores aditivos.
Sin embargo, no puedo encontrar una descripción definitiva de la asociatividad, ya sea izquierda o derecha. Esto es importante ya que 35/5*2
sería 14
para una variante (35/5)*2
y 3
para la otra variante 35/(5*2)
.
Sección 6.5 Expressions /3, footnote 74
estado:
La sintaxis especifica la precedencia de los operadores en la evaluación de una expresión, que es el mismo que el orden de los principales apartados de esta subcláusula, la más alta prioridad en primer lugar.
Dentro de cada subcláusula principal, los operadores tienen la misma precedencia. Asociatividad izquierda o derecha se indica en cada subcláusula por la sintaxis de las expresiones discutidas allí.
Sin embargo, tomando el caso multiplicativo, por ejemplo:
6.5.5 operadores multiplicativos
Sintaxis
multiplicative-expression:
cast-expression
multiplicative-expression * cast-expression
multiplicative-expression/cast-expression
multiplicative-expression % cast-expression
Restricciones
Cada uno de los operandos debe tener un tipo aritmético. Los operandos del operador%
serán con tipo entero.
Semántica
Las conversiones aritméticas habituales se realizan sobre los operandos.
El resultado del operador binario*
es el producto de los operandos.
El resultado del operador/
es el cociente de la división del primer operando por el segundo; el resultado del operador%
es el resto. En ambas operaciones, si el valor de el segundo operando es cero, el comportamiento no está definido.
Cuando se dividen los enteros, el resultado del operador/
es el cociente algebraico con cualquier parte fraccional descartada. Si el cocientea/b
es representable, la expresión(a/b)*b + a%b
será igual aa
.
puedo ver nada allí que menciona la asociatividad, ni tampoco parece que hay algún establecimiento en otro lugar en el estándar por defecto.
¿Falta algo aquí?
Aaahh, ya veo, en realidad está en _grammar_ en lugar de en el texto explicativo. Eso tiene sentido. Es de suponer que 'expresión-moldeada * expresión-multiplicativa' sería correcto-asociativo. – paxdiablo
Correcto. Agregué un ejemplo de asociatividad correcta tomada del estándar. –
Eso es lo que la asociatividad a la izquierda o a la derecha se indica en cada subcláusula por la sintaxis que intentamos decir en la nota al pie. –