Когда имеет значение ассоциативность операторов?

Большинство языков программирования имеют таблицу приоритетов и ассоциативности для бинарных операторов. Ассоциативность имеет значение в некоторых случаях, например (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)

Вы не можете просто сказать: мне все равно.

Другие вопросы по тегам