Когда имеет значение ассоциативность операторов?
Большинство языков программирования имеют таблицу приоритетов и ассоциативности для бинарных операторов. Ассоциативность имеет значение в некоторых случаях, например (a - b) - c
знак равно a - (b - c)
,
Однако для ассоциативного оператора, такого как &&
Казалось бы, не имеет значения, но большинство языков перечисляют это как левый ассоциативный.
Есть ли ситуации, когда на самом деле есть разница между (a && b) && c
а также a && (b && c)
?
2 ответа
Я не могу поверить, что есть так много неправильных (удаленных) ответов... возможно, я должен ответить на это.
Прежде всего, приоритет!= Ассоциативность!= Порядок оценки.
Теперь, когда у нас есть это вне пути: ассоциативность имеет значение в некоторых случаях.
За a + b + c
имеет значение, когда a
, b
, а также c
являются числами с плавающей точкой вместо целых, потому что ошибки округления будут накапливаться по-разному в зависимости от того, как сгруппированы термины.
Для частного случая &&
а также ||
, это не имеет значения до тех пор, пока они не перегружены (что возможно только в C++, но не в C), но язык по-прежнему определяет один только для согласованности - и так, чтобы "древовидное" представление кода (на основе по грамматике) уникален. Это также работает на пользу C++, так как теперь значение перегруженного &&
а также ||
не двусмысленно
Добавление к @Mehrdads@ answer (за что я проголосовал):
Если вы когда-либо создавали парсер, вы заметите, что ваши операторы должны иметь ассоциативность, в противном случае
a && b && c
было бы просто синтаксической ошибкой. Предполагая, что вышеупомянутое не должно быть синтаксической ошибкой, вы должны решить, должно ли это означать:
(a && b) && c
или же
a && (b && c)
Вы не можете просто сказать: мне все равно.