Введение
В каждом учебнике на C/С++ вы найдете таблицу приоритетов и ассоциативности операторов, такую как:
http://en.cppreference.com/w/cpp/language/operator_precedence
Один из вопросов в StackOverflow спросил что-то вроде этого:
В каком порядке выполняются следующие функции:
f1() * f2() + f3();
f1() + f2() * f3();
Ссылаясь на предыдущий график, я уверенно ответил, что функции имеют лево-правовую ассоциативность, поэтому в предыдущих утверждениях они оцениваются как в обоих случаях:
f1() → f2() → f3()
После оценки функций вы заканчиваете оценку следующим образом:
(a1 * a2) + a3
a1 + (a2 * a3)
К моему удивлению, многие люди сказали мне, что я ошибался. Будучи преисполнен решимости доказать их неправоту, я решил обратиться к стандарту ANSI C11. Я снова был удивлен, узнав, что очень мало упоминается о приоритете и ассоциативности операторов.
Вопросы
- Если моя вера в то, что функции всегда оцениваются слева направо, неверна, что действительно означает таблица, ссылающаяся на приоритет функции и ассоциативность?
- Кто определяет приоритет и ассоциативность операторов, если это не ANSI? Если это ANSI, который делает определение, почему мало упоминается о приоритете и ассоциативности операторов? Является ли приоритет и ассоциативность операторов выведенными из стандарта ANSI C или определен в математике?