Вопрос

Большинство языков программирования имеют таблицу приоритета и ассоциативности для двоичных операторов.Ассоциативность имеет значение в некоторых случаях, например (a - b) - c != a - (b - c).

Однако для ассоциативного оператора типа && казалось бы, это не имеет значения, однако большинство языков относят это к левоассоциативным.

Существуют ли какие-либо ситуации, когда на самом деле существует разница между (a && b) && c и a && (b && c)?

Это было полезно?

Решение

Я не могу поверить, что существует так много неправильных (удаленных) ответов...может быть, мне следует ответить на этот вопрос.

Прежде всего, приоритет != ассоциативность != порядок оценки.

Теперь, когда мы покончили с этим,:в некоторых случаях ассоциативность имеет значение.
Для a + b + c, это имеет значение , когда a, b, и c являются числами с плавающей запятой вместо целых чисел, поскольку ошибки округления будут накапливаться по-разному в зависимости от того, как сгруппированы термины.

Для конкретного случая && и ||, это не имеет значения до тех пор, пока они не будут перегружены (что возможно только в C ++, а не C), но язык по-прежнему определяет его только для согласованности - и так, чтобы "древовидное" представление кода (основанное на грамматике) было уникальным.Это также идет на пользу C ++, поскольку теперь значение перегруженного && и || это не двусмысленно.

Другие советы

Добавление к @ mehrdads @ Ответ (который я усвоил):

Если вы когда-либо построили парсер, вы заметите, что ваши операторы должны иметь ассоциативность, в противном случае

a && b && c
.

будет просто синтаксической ошибкой.Предполагая, что вышеизложенное не должно быть синтаксической ошибкой, вы должны решить, следует ли это означать:

(a && b) && c
.

или

a && (b && c)
.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top