2012-02-23 18 views
8

Nello standard C99, le espressioni consentono la precedenza e l'associatività.associatività C99 per gli operatori - dove è specificato?

precedenza viene documentata abbastanza bene poiché l'ordine in cui gli operatori compaiono nel documento sono di ridurre la precedenza, così chiamate di funzione vengono prima operatori moltiplicativi che, a loro volta, vengono prima di operatori additivi.

Tuttavia, non riesco a trovare una descrizione definitiva dell'associatività, che sia sinistra o destra. Questo è importante poiché 35/5*2 sarebbe 14 per una variante (35/5)*2 e 3 per l'altra variante 35/(5*2).

Sezione 6.5 Expressions /3, footnote 74 stato:

La sintassi specifica la precedenza degli operatori nella valutazione di un'espressione, che è la stessa come l'ordine dei principali sottoclausole di questo subclause, massima precedenza primi.

All'interno di ogni sottopunto principale, gli operatori hanno la stessa precedenza. L'associatività sinistra o destra è indicata in ogni sottoclaus dalla sintassi per le espressioni discusse al suo interno.

Tuttavia, prendendo il caso moltiplicativo, ad esempio:

6.5.5 Operatori moltiplicativi
    Sintassi
        multiplicative-expression:
            cast-expression
            multiplicative-expression * cast-expression
            multiplicative-expression/cast-expression
            multiplicative-expression % cast-expression

    Vincoli

Ciascuno degli operandi deve avere un tipo aritmetico. Gli operandi dell'operatore % devono avere di tipo intero.

    semantica

I normali conversioni aritmetiche vengono eseguite su operandi.

Il risultato dell'operatore binario * è il prodotto degli operandi.

Il risultato dell'operatore / è il quoziente dalla divisione del primo operando secondo ; il risultato dell'operatore % è il resto. In entrambe le operazioni, se il valore di il secondo operando è zero, il comportamento non è definito.

Quando gli interi sono divisi, il risultato dell'operatore / è il quoziente algebrico con qualsiasi parte frazionata scartata. Se il quoziente a/b è rappresentabile, l'espressione (a/b)*b + a%b equivale a a.

riesco a vedere nulla in là che cita l'associatività, né sembrano esserci qualsiasi impostazione altrove nello standard di default.

Mi manca qualcosa qui?

risposta

9

L'associatività dell'operatore non è specificata esplicitamente come "associazione-destra" o "associazione-sinistra". Lo deduci dalla grammatica. Nel tuo esempio, il termine multiplicative-expression fa riferimento a se stesso in modo ricorsivo e la ricorsione si trova sul lato sinistro dell'operatore. Ciò significa che un parser che incontra a * b * c deve analizzare come (a * b) * c, che è associato a sinistra.

Il termine assignment-expression (6.5.16) ha questa grammatica:

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

Quindi un parser incontra a = b = c deve analizzarlo come a = (b = c), che si trova proprio-associativa.

+0

Aaahh, vedo, è in realtà nel _grammar_ piuttosto che nel testo esplicativo. Ciò ha senso. Presumibilmente, l'espressione moltiplicativa-espressione cast-espressione sarebbe giusta-associativa. – paxdiablo

+0

corretto. Ho aggiunto un esempio di associatività destra preso dallo standard. –

+0

Questo è ciò che 'l'associatività sinistra o destra è indicata in ogni sottoclaus dalla sintassi' nella nota che sta cercando di dire. –

3

La grammatica stessa specifica associativa, dalle produzioni utilizzati:

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

Ciò significa che in a * b * c, c deve essere analizzato come un cast-expression, e a * b come uno multiplicative-expression, prima di ulteriori analisi del a * b stessa. Quindi l'associatività di sinistra della moltiplicazione è forzata nell'albero della sintassi dalle regole di parsing.