#c #parsing #variable-assignment
#c #синтаксический анализ #присвоение переменной
Вопрос:
Где ассоциативность оператора =
присваивания будет иметь значение в выражении? Я думал, что ассоциативность относится к операндам, которые совместно используют оператор, но как это будет работать в случае присваивания? Вот несколько примеров, которые (могут) иметь отношение к делу::
x = 1
x 2 = y 3 = z 5
Означает ли это просто, что в приведенных выше заданиях мы должны были бы:
y 3 = z 5
Сделано раньше, например:
x 2 = y 3
Или какие другие сценарии существуют, где ассоциативность присваивания «имеет значение»?
Комментарии:
1.
x 2 = y 3
Это недопустимый C, так что это не очень хороший пример. Ассоциативность имеет значение в таких случаях , какint x, y = 0, z = 1; x = y = z;
.2. Лучшим примером было бы
a = b = c 1
. Вы не хотите, чтобы это означалоa = b
, что за ним следуетb = c 1
.3. В ваших примерах вы пробовали их, чтобы посмотреть, компилируются ли они?
Ответ №1:
Ваши примеры ничего не демонстрируют, потому что ассоциативность вступает в игру только тогда, когда у вас есть несколько операторов с одинаковым приоритетом (или один и тот же оператор) рядом друг с другом.
Рассмотрим x = y = 42
, который устанавливает обе переменные равными 42.
Из-за правоассоциативности оно анализируется как x = (y = 42)
, где y = ...
возвращает новое значение y
, равное 42 .
Вот почему это работает. Если =
было левоассоциативным и оно было проанализировано как (x = y) = 42
, то:
- В C он вообще не компилировался бы, потому
x = ...
что возвращает rvalue, а не lvalue , и они не могут быть назначены. - В C , где присваивания возвращают значения lvalues , это будет работать так
x = y; x = 42;
, что далеко не интуитивно понятно.
Комментарии:
1. В C
(x = y) = 42;
это будет работать,x=y, x=42;
не так ли?