Но, если это неоднозначно для вас - кодера - и это должно быть потому, что вы должны спросить, тогда ожидайте, что это будет по крайней мере столь же неоднозначно для читателя и потратите пару октетов для ясности.
Полагаться на правила приоритетов - это здорово, если вы оказались компилятором.
добавлены ответы на комментарии :
Для человека, читающего код, который сталкивается с неоднозначностью, требующей внешних консультаций для уверенности, вы должны предположить, что следующий читатель будет менее опытнымчем вы и сэкономить им усилия и избежать человеческой ошибки разбора той же конструкции и добавить скобки для них.
Так получилось, что даже принятый ответ был неверным (обоснование, а не эффект, см. Его первый комментарий), о котором я не знал, и ни одна не была частью тех, кто проголосовал за него.
Что касается утверждения об основной алгебре, то конкретный пример, используемый в ОП, поучителен.Независимо от приоритета оператора выражение j * (j / m)
алгебраически идентично (j * j) / m
.К сожалению, алгебра Питона является лишь приближением алгебры «платоновского идеала», которая может дать неправильные ответы для любой формы в зависимости от величин j
и m
.Например:
>>> m = 1e306
>>> m
1e+306
>>> j = 1e307
>>> j
9.9999999999999999e+306
>>> j / m
10.0
>>> j*j
inf
>>> j * (j / m)
1e+308
>>> (j * j) / m
inf
>>> ((j * j) / m) == (j * (j/m))
False
Таким образом, свойство тождества квазиалгебры Python (и моего FPU) не выполняется.И это может отличаться на вашем компьютере, так как примечания к документации :
Числа с плавающей запятой реализованы с использованием двойного в C. Все ставки на их точность отключены, если вы не случайнознать машину, с которой вы работаете.
Можно утверждать, что никто не имеет дела с волосатыми краями переполнения, и это в некоторой степени верно, но удалено из контекста, выражение является неопределенным, учитываяодин порядок операций и «правильный» под другой.