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 iloraza/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?
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
Prawidłowo. Dodałem przykład skojarzenia prawości wziętego ze standardu. –
To właśnie to, co "prawostronna lub prawostronna asocjatywność jest wskazana w każdym podrozdziale, przez składnię" w przypisie, próbuje powiedzieć. –