2012-02-23 12 views
8

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 cociente a/b es representable, la expresión (a/b)*b + a%b será igual a a.

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í?

Respuesta

9

La asociatividad del operador no se especifica explícitamente como "asociativa de la derecha" o "asociativa de la izquierda". Lo deduces de la gramática. En su ejemplo, el término multiplicative-expression se refiere a sí mismo recursivamente, y la recursión está en el lado izquierdo del operador. Eso significa que un analizador que encuentra a * b * c debe analizar a * b * c como (a * b) * c, que es asociativo de la izquierda.

El término assignment-expression (6.5.16) tiene esta gramática:

assignment-expression: 
    conditional-expression 
    unary-expression assignment-operator assignment-expression 

Así encontrarse con un analizador a = b = c tiene que analizar como se a = (b = c), que es asociativo por la derecha.

+0

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

+0

Correcto. Agregué un ejemplo de asociatividad correcta tomada del estándar. –

+0

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. –

3

La gramática determine por sí mismo asociatividad, por las producciones utilizados:

multiplicative-expression: 
    cast-expression 
    multiplicative-expression * cast-expression 

Esto significa que en a * b * c, c se debe analizar como cast-expression, y a * b como uno multiplicative-expression, antes de continuar el análisis sintáctico de a * b sí mismo. De este modo, la asociatividad de la izquierda de la multiplicación se ve forzada en el árbol de sintaxis por las reglas de análisis sintáctico.

Cuestiones relacionadas