Противоречие о порядке оценки операндов - PullRequest
4 голосов
/ 27 мая 2020

Когда я изучаю рекурсивные функции в C из deitel c, я читаю следующее предложение:

Стандартный C не указывает порядок, в котором операнды большинства операторы (включая +) должны быть оценены.

Но также в книге говорится, что:

ассоциативность '+' слева направо

Порядок оценки операндов:

order of evaluation of operands

Может ли кто-нибудь объяснить, почему это так?

1 Ответ

6 голосов
/ 27 мая 2020

Порядок оценки и ассоциативность - это две разные вещи, возьмите пример:

int x = func1() - func2() - func3(); //having int return types

В этом выражении вы не можете знать, будет ли func1() оцениваться первым или последним, то есть вы не Я знаю, какая функция будет вызвана и вернет ее значение первой, однако вы знаете, что ассоциативность, как и в случае +, будет выполняться слева направо, сначала func1() - func2(), затем результат этого вычитания - func3().

В C нет концепции оценки слева направо или справа налево, которую не следует путать с чтением слева направо и справа налево. ассоциативность операторов: выражение f1() + f2() + f3() анализируется как (f1() + f2()) + f3() из-за ассоциативности слева направо operator+, но вызов функции f3() может оцениваться первым, последним или между f1() или f2() во время выполнения.

https://en.cppreference.com/w/c/language/eval_order

...