2012-02-23 13 views
8

W standardzie C99 wyrażenia pozwalają na pierwszeństwo i asocjatywność.Zależność C99 dla operatorów - gdzie jest określona?

Pierwszeństwo jest dość dobrze udokumentowane, ponieważ kolejność, w jakiej operatorzy pojawiają się w dokumencie, zmniejsza priorytet, więc wywołania funkcji występują przed operatorami multiplikatywnymi, które z kolei występują przed operatorami dodatków.

Jednak nie mogę znaleźć ostatecznego opisu powiązania, niezależnie od tego, czy jest w lewo, czy w prawo. Jest to ważne, ponieważ 35/5*2 będzie 14 dla jednego wariantu (35/5)*2 i 3 dla drugiego wariantu 35/(5*2).

Sekcja 6.5 Expressions /3, footnote 74 stan:

Składnia określa pierwszeństwo operatorów w ocenie wyrazu, która jest taka sama jak kolejność głównych podrozdziałów niniejszego podrozdziału, najwyższy priorytet pierwszych.

W ramach każdego głównego podzbioru operatory mają takie samo pierwszeństwo. Łączność lewostronna lub prawostronna jest wskazana w każdym podrozdziale przez składnię omówionych tam wyrażeń.

Jednakże, biorąc multiplikatywne przypadek, na przykład:

6.5.5 multiplikatywne operatorzy
    Składnia
        multiplicative-expression:
            cast-expression
            multiplicative-expression * cast-expression
            multiplicative-expression/cast-expression
            multiplicative-expression % cast-expression

    Ograniczenia

Każdy z operandów powinien mieć typ arytmetyczny. Operandy operatora % mają typ całkowity.

    Semantyka

Zwykłe arytmetyczne konwersje są wykonywane na argumentach.
Wynik binarnego operatora * jest wynikiem operacji.
Wynik operatora / jest ilorazem z podziału pierwszego argumentu przez sekundę; wynik operatora % to pozostała część. W obu operacjach, jeśli wartość drugi operand wynosi zero, zachowanie jest niezdefiniowane.
Gdy liczby całkowite są podzielone, wynikiem operatora / jest iloraz algebraiczny z odrzuconą częścią ułamkową w postaci . Jeśli iloraz a/b jest reprezentowalny, wyrażenie (a/b)*b + a%b powinno być równe (a/b)*b + a%b.

widzę że nic nie wspomina o skojarzenie, ani też nie wydaje się żadnych domyślne ustawienie gdzie indziej w normie.

Czy tu czegoś brakuje?

Odpowiedz

9

Zrzeszenie operatorów nie jest jawnie określane jako "skojarzenie prawostronne" lub "skojarzenie lewostronne". Odczytujesz to z gramatyki. W twoim przykładzie termin multiplicative-expression odnosi się do siebie rekurencyjnie, a rekurencja jest po lewej stronie operatora. Oznacza to, że analizator składni, który napotkał a * b * c, musi przeanalizować a * b * c, np. (a * b) * c, który jest skojarzony lewostronnie.

assignment-expression termin (05.06.16) ma tę gramatykę:

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

Więc parser napotyka a = b = c musi przeanalizować go jak a = (b = c), która jest prawym asocjacyjne.

+0

Aaahh, Rozumiem, że jest to raczej raczej gramgram_ niż tekst objaśniający. To ma sens. Przypuszczalnie wyrażenie 'cast-expression * multiplicative-expression 'byłoby prawostronne. – paxdiablo

+0

Prawidłowo. Dodałem przykład skojarzenia prawości wziętego ze standardu. –

+0

To właśnie to, co "prawostronna lub prawostronna asocjatywność jest wskazana w każdym podrozdziale, przez składnię" w przypisie, próbuje powiedzieć. –

3

Sam gramatyki określa skojarzenie, przez produkcji używanych:

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

Oznacza to, że w a * b * c, c muszą być przetwarzane jako cast-expression i a * b jako jeden multiplicative-expression przed dalszym przetwarzaniu samej a * b. Tak więc lewostronność mnożenia jest wciskana do drzewa składni przez reguły parsowania.

Powiązane problemy