Kto definiuje pierwszeństwo i powiązanie operatora C?

Wprowadzenie

W każdym podręczniku C / C ++ znajdziesz tabelę pierwszeństwa operatora i tabelę asocjacyjną, taką jak:

http://en.cppreference.com/w/cpp/language/operator_precedence

Jedno z pytań dotyczących StackOverflow zapytało coś takiego:

Jaką kolejność wykonują następujące funkcje:

f1() * f2() + f3();
f1() + f2() * f3();

Odnosząc się do poprzedniego wykresu, z ufnością odpowiedziałem, że funkcje mają powiązania od lewej do prawej, więc w poprzednich stwierdzeniach są one oceniane w ten sposób w obu przypadkach:

f1 () -> f2 () -> f3 ()

Po ocenie funkcji kończysz ocenę w następujący sposób:

(a1 * a2) + a3
a1 + (a2 * a3)

Ku mojemu zdziwieniu wielu ludzi powiedziało mi, że źle się czuję. Zdeterminowany, by udowodnić, że się mylą, postanowiłem przejść do standardu ANSI C11. Po raz kolejny byłem zaskoczony tym, że niewiele mówi się o pierwszeństwie i asocjatywności operatora.

pytaniaJeśli moje przekonanie, że funkcje są zawsze oceniane od lewej do prawej, jest błędne, co tak naprawdę oznacza tabela odnosząca się do pierwszeństwa funkcji i asocjatywności?Kto definiuje pierwszeństwo operatora i łączność, jeśli nie jest to ANSI? Jeśli to ANSI tworzy definicję, dlaczego niewiele mówi się o pierwszeństwie i asocjatywności operatora? Czy operator ma pierwszeństwo i asocjatywność na podstawie standardu ANSI C, czy jest zdefiniowany w matematyce?

questionAnswers(5)

yourAnswerToTheQuestion